我正在阅读文章Java Sorting: Comparator vs Comparable Tutorial,并对此有一些疑问。
List<Employee> col = new ArrayList<Employee>();
col.add(new Employee(5, "Frank", 28));
col.add(new Employee(1, "Jorge", 19));
col.add(new Employee(6, "Bill", 34));
col.add(new Employee(3, "Michel", 10));
col.add(new Employee(7, "Simpson", 8));
col.add(new Employee(4, "Clerk", 16));
col.add(new Employee(8, "Lee", 40));
col.add(new Employee(2, "Mark", 30));
return col;
这是Employee对象的ArrayList。我可以在此员工对象中添加多少项?我可以这样做吗?
col.add(new Employee(5, "Frank", 28, "asas", "asas"));
这基本上是像Array[0]
这样的对象数组。我实际上是尝试通过ArrayList
访问这些对象数组。
为什么printList
是静态的?我可以在这里有其他类型吗?
private static void printList(List<Employee> list) {
System.out.println("EmpId\tName\tAge");
for (Employee e: list) {
System.out.println(e.getEmpId() + "\t" + e.getName() + "\t" + e.getAge());
}
}
在比较时,this
代表什么,o
代表什么?
public int compareTo(Employee o) {
return this.empId - o.empId;
}
this
在这里意味着什么?
答案 0 :(得分:2)
我可以添加多少项?
您可以将项添加到列表中,直到Java VM内存不足为止。没有人为限制。
我可以做这样的事吗?
col.add(new Employee(5, "Frank", 28, "asas", "asas"))
不,因为Employee
没有构造函数接受这些参数。但你可以
col.add(new Employee(5, "Frank", 28));
这为列表中的两个非常相似但不相同的实例提供了它们(它们不相同,因为它们位于内存中的不同位置;它们是相似的,因为所有字段都具有相同的值)。
为什么printList变为静态?
因此,可以从静态方法main()
调用它,而无需创建TestEmployeeSort
的实例
这代表什么代表什么?
排序算法将在列表中选择两个项目,并在另一个项目上调用compareTo()
作为参数。前者为this
,后者为o
。
这样,排序算法不需要了解它所比较的对象。
优点是您可以轻松地使对象具有可比性。缺点是该列表不得包含null
指针或非Employee
实例。
如果这对你不起作用,你可以创建一个Comparator
,它也有一个compareTo
方法,但需要两个参数。
答案 1 :(得分:2)
约翰,
col.add只接受一个Bject。因此,您使用新操作创建一个Employee对象并将其添加到列表中。所以,你不能使用这个 - 新员工(5,“Frank”,28,“asas”,“asas”),因为Employee对象没有这样的构造函数。 Evene如果它有这样的构造函数,它只创建一个Employee对象。
printLine是静态的,因为您需要先创建TestEmployeeSortobject,才能使用非静态方法。但它没有任何意义(创建非静态对象)因为printLine不使用TestEmployeeSortobject的内部状态,因此,在这种情况下它可以而且必须是静态的。
compareTo定义whi比其他的大。查看API: 返回: 负整数,零或正整数,因为此对象小于,等于或大于指定对象。
因此,在这种情况下,如果Id更大,作者决定Employee更大。您可以更改该方法以使用任何其他字段来定义排序顺序。
答案 2 :(得分:1)
此引用对象的当前实例, o 是compareTo函数的Employee参数。如果不知道如何比较列表中的对象,则无法对列表进行排序,在这种情况下,您需要比较员工ID。
做一个也会更优雅
System.out.println(e.toString());
并覆盖Employee的toString方法,而不是为每个字段调用getter。
答案 3 :(得分:1)
如果修改了类变量和构造函数,可以向Employee对象添加更多“items”:
公共类员工{ private int empId; 私有字符串名称; private int age;
// add new var
private Object x;
public Employee(int empId, String name, int age) {
// set values on attributes
}
// add new construct
public Employee(int empId, String name, int age, Object x) {
//set the other attributes
// this.x represents the current instance's x property, and x represents the parameter from the construct
this.x = x;
}
// getters & setters
}
要获取对象,我会推荐myList.get(index)...
答案 4 :(得分:1)
第一个问题:除非有另一个构造函数
,否则你不能Employee (int, String, int, String, String)
第二个问题:我不确定你在问什么...我相信其他人可以提供帮助。
第三个问题:“this”表示调用方法compareTo的Employee,“o”表示作为参数传递的employee。大多数compareTo方法如果对象相等则返回0,在这种情况下,如果对象不相等则返回任何其他方法。所以这种方法比较员工ID。如果它是相同的Employee,this.empId - o.empId将返回0
答案 5 :(得分:1)
我可以这样做吗?
是。
col.add(new Employee(5, "Frank", 28, "asas", "asas"))
与
相同Employee e = new Employee(5, "Frank", 28, "asas", "asas");
col.add(e);
我可以在此员工对象中添加多少项
你的名单对吗?没有实际限制。
为什么
printList
变成了静态?
此printList
方法是实用程序方法。这与类的数据无关,并且与某些实用程序有关,并且不必存在于方法的每个实例中。做一些格式化,日志记录和这类东西的方法通常是静态的。
在比较......这代表什么和代表什么。
在compareTo
中,这是调用compareTo
的当前对象,o
是传递给它的对象。
因此,当您说e1.compareTo(e2)
时,e1
就是这个而e2
是o
。