java - 查看没有嵌套循环的类 Arraylist 对象
问题描述
上学期我有一个面向对象的编程项目,它是关于模拟一个简单的宿舍。
1. 应该有一个管理器类,其中主要方法和其他 80% 的方法必须存在。2.一个宿舍类,包含一个数组列表。3.一个包含房间数组列表的块类。4.一个包含学生数组列表的房间类。5.所有这些类都包含其私有变量的getter和setter。
有一些我们应该添加到程序中的方法与我的问题无关,所以我不会在这里写它们,但问题是,其中一些方法需要查看这些数组列表才能找到一个特定的对象。例如,一个具有特定学号的学生。我用嵌套循环创建了这些方法。但我知道有一些方法可以避免大量嵌套。
这是我的简化代码。我将只让管理器类包含一个嵌套循环方法作为示例:
import java.util.Scanner;
public class Manager {
private String name;
private String familyName;
private String userName;
private String passWord;
private static Scanner scan = new Scanner(System.in);
private Dormitory dorm = new Dormitory();
private static Menu menu = new Menu();
private Student tempStudent;
private Block tempBlock;
private Room room;
private boolean bool;
{
dorm.setDormManager(this);
}
public Manager(String managerName, String managerID) {
name = managerName;
userName = managerID;
}
//find student with its number
public void findStudent() {
//Taking the student number from the user.
System.out.println("Please enter the student number:");
String studentNum = scan.nextLine();
for (int i = 0; i < dorm.getBlockList().size(); i++)
for (int j = 0; j < dorm.getBlockList().get(i).getRooms().size(); j++)
for (int k = 0; k < dorm.getBlockList().get(i).getRooms().get(j).getRoomStudents().size(); k++)
if (dorm.getBlockList().get(i).getRooms().get(j).getRoomStudents().get(k).getStudentNumber().equals(studentNum)) {
tempStudent = dorm.getBlockList().get(i).getRooms().get(j).getRoomStudents().get(k);
break;
}
}
public void create() {
//Used loops for the original program.
Block block1 = new Block("1");
Block block2 = new Block("2");
dorm.getBlockList().add(block1);
dorm.getBlockList().add(block2);
Room room1 = new Room("1");
Room room2 = new Room("2");
dorm.getBlockList().get(0).getRooms().add(room1);
dorm.getBlockList().get(1).getRooms().add(room2);
Student student1 = new Student("12345678");
Student student2 = new Student("98765432");
dorm.getBlockList().get(0).getRooms().get(0).getRoomStudents().add(student1);
dorm.getBlockList().get(1).getRooms().get(0).getRoomStudents().add(student2);
}
public static void main(String[] args) {
Manager manager = new Manager("Dumbledore", "@1112");
manager.create();
}
}
public class Dormitory {
private int blocks;
private Manager dormManager;
private long allMembers;
private ArrayList<Block> blockList = new ArrayList<Block>();
}
public class Block {
private String blockNumber;
private ArrayList<Room> rooms = new ArrayList<Room>();
private Dormitory dorm = new Dormitory();
public Block(String blockNum) {
blockNumber = blockNum;
}
}
public class Room {
private String roomNumber;
private ArrayList<Student> roomStudents = new ArrayList<Student>();
private Block roomBlock;
private Student roomManager;
public Room(String roomNum) {
roomNumber = roomNum;
}
}
public class Student {
private String studentName;
private String studentFamilyName;
private String studentNumber;
private Room room;
public Student(String studentNum) { //Creates a student object using the student number.
studentNumber = studentNum;
}
}
我尽力减少代码。我搜索了很多,问了很多人,但我没有得到我想要的答案。我不知道为什么我找不到任何关于这个的东西,但如果你能借给我,我会非常感激帮忙或者给我相关文章的链接。
解决方案
简短的回答:不,你永远不应该遍历所有检查getStudentNumber().equals(studentNum)
. 这具有线性时间复杂度 O(N)
长答案:您应该根据您的查询索引您的数据
例如:使用具有恒定时间复杂度 O(1)的 HashMap 进行索引。(注意:此代码不是线程安全的)
public class SchoolService {
private Map<String, Student> studentsById = new HashMap<>();
private Map<Long, Dorm> dormsById = new HashMap<>();
/// dormsByAreaCode is showing an example of an index which groups objects into lists
private Map<String, List<Dorm>> dormsByAreaCode = new HashMap<>();
public void addStudent(Student student) {
if (studentsById.containsKey(student.getName()) {
throw new IllegalStateException("Duplicate student " + student.getName());
}
studentsById.put(student.getId(), student);
}
public Student getStudentById(String studentId) {
Student student = studentsById.get(studentId);
if (student == null) {
throw new IllegalStateException("No such student " + studentId);
}
return student;
}
public void addDorm(Dorm dorm) {
// TODO: validation
dormsById.put(dorm.getId(), dorm);
List<Dorm> areaDorms = dormsByAreaCode.get(dorm.getAreaCode());
if (areaDorms == null) {
areaDorms = new ArrayList<>();
dormsByAreaCode.put(dorm.getAreaCode(), areaDorms);
}
areaDorms.add(dorm);
}
public Dorm getDormById(long dormId) {
Dorm dorm = dormsById.get(id);
// TODO: validation
return dorm;
}
public List<Dorm> getDormsByAreaCode(String areaCode) {
List<Dorm> areaDorms = dormsByAreaCode.get(areaCode);
// TODO: validation
return areaDorms;
}
// etc
}
推荐阅读
- c++11 - 结构位域上的 std::atomic
- python - EmptyDataError:导入许多 csv 文件时,没有要从文件 python 解析的列
- python - 从数据“列表”填充键值字典“列表”
- c - 格式说明符中 h,l 的来源是什么?
- scala - How write Reads function for Scala Play
- php - 如何处理 Guzzle 异步请求中的异常?
- iot - 如何解决 PLC 上缺少 IoT 驱动程序的问题
- android - 从用户谷歌日历获取事件的最佳做法是什么?
- javascript - 使用 Perl 解析 JavaScript:从 JE->parse 获取“undef”
- c++ - 生成 RSA-2048 密钥(公共和私有)