我想使用我自己的排序方法而不是Collections.sort
,以便我可以修改我的程序以更好地理解其他种类,泛型和ArrayList
。
我有一个有员工编号成员的员工类。我知道如何制作ArrayList
个Employee对象,但是你能解释一下我如何打印和排序它们吗?我开始通过对常规数组进行排序,并希望对Employee对象的ArrayList(员工编号)执行相同的操作。我无法理解如何打印对象的ArrayLists并对它们进行排序。
package dataStructures;
import java.util.ArrayList;
import java.util.Arrays;
public class SortPractice {
public static void main(String[] args) {
int[] nums = {5,4,3,2,1};
System.out.println(Arrays.toString(nums));
BubbleSort1(nums);
ArrayList<Employee> empList = new ArrayList<Employee>();
for (int i=0; i<10; i++) {
empList.add(new Employee(10-i));
}
BubbleSort(empList); //This method doesn't work. I need help here.
}
public static void BubbleSort (int[] A) { //I included this because I know it works.
int temp = 0;
int firstLoopCount = 0;
int SecLoopCount = 0;
for (int i=0; i< A.length-1; i++) {
firstLoopCount++;
System.out.println(Arrays.toString(A) + i + " << First Loop interation");
for (int j=0; j<A.length-1; j++) {
if (A[j] > A[j+1]) {
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
SecLoopCount++;
System.out.println(Arrays.toString(A) + j + " << Second Loop Interation");
}
}
System.out.println((firstLoopCount+SecLoopCount));
}
public static void BubbleSort (ArrayList<Employee> empList) { //I tried to use the same
int temp = 0; //approach just with the List
int firstLoopCount = 0;
int SecLoopCount = 0;
for (int i=0; i<empList.size()-1; i++) {
firstLoopCount++;
System.out.println(Arrays.toString(empList) + i + " << First Loop interation");
for (int j=0; j<empList.size()-1; j++) {
if (empList.get(j) > empList.get(j+1)) { //I get errors here in Eclipse and
temp = A[j]; //up above when I use toString
A[j] = A[j+1];
A[j+1] = temp;
}
SecLoopCount++;
System.out.println(Arrays.toString(A) + j + " << Second Loop Interation");
}
}
System.out.println((firstLoopCount+SecLoopCount));
}
这是员工类。它有其他的吸气剂和二传手,但我没有包含它们。
package dataStructures;
public class Employee {
private int empNum;
private String firstName;
private String LastName;
private String email;
public Employee(int empNum) {
this.empNum = empNum;
}
public String toString(){
return " "+ empNum + ",";
}
public Employee() {
}
public int getEmpNum() {
return empNum;
}
public void setEmpNum(int empNum) {
this.empNum = empNum;
}
答案 0 :(得分:2)
我注意到的一个问题就是这一行 -
empList.get(j) > empList.get(j+1)
您正在比较2个对象,即2个员工对象,除了原始类型(例如整数)之外,通常不会使用它。
您可能想要比较的是我假设在Employee.java文件中的员工ID(请发布此文件以便我们查看)。以下是您可以为此行做些什么的示例 -
empList.get(j).getEmployeeId() > empList.get(j+1).getEmployeeId()
编辑:抱歉读错了,不使用Collections.sort()
答案 1 :(得分:2)
访问数组不同于访问ArrayList
。这是因为这两个对象根本不同。
让我们关注这一行代码:
System.out.println(Arrays.toString(empList) + i + " << First Loop interation");
您将要为Java 7 API添加书签,以便您可以引用这些方法实际作为参数的内容。相信我,从长远来看,它会为你节省很多时间。
具体而言,代码无效,因为toString
不接受ArrayList
类型的参数。您可以直接打印 ArrayList
,因为它有一个合理的toString
方法,而数组则没有(这就是您使用Arrays#toString
的原因):
System.out.println(empList.toString() + i + " << First Loop interation");
让我们看看下面的if
块:
if (empList.get(j) > empList.get(j + 1)) { //I get errors here in Eclipse and
temp = A[j]; //up above when I use toString
A[j] = A[j + 1];
A[j + 1] = temp;
}
我会直言不讳,你会在任何合理的IDE中使用该代码获得错误。原因是:您使用括号索引数组,但对get
使用ArrayList
。
第一个问题是您无法将这两个实例与>
进行比较。你要做的就是检索你想要与之比较的字段。
if(empList.get(j).getEmpNum() > empList.get(j+1).getEmpNum()) {
// more code
}
Here's the relevant Javadoc for ArrayList
。你需要它。
让我们关注if
的内部部分。您在那里进行的操作称为交换。您从一个位置获取元素并用另一个位置覆盖它。由于数组不会向下移动元素,因此必须在覆盖它之前捕获原始值。
用英文说:
您不应该ArrayList
使用add the element in a specific spot这样做。
在英语中,它应该如下:
在Java中,它可能如下所示:
if(empList.get(j).getEmpNum() > empList.get(j + 1).getEmpNum()) {
empList.add(j, empList.get(j + 1));
empList.remove(j + 1);
}
答案 2 :(得分:1)
这是一个例子。在这种情况下,您的类必须提供一个方法来覆盖Comparable接口中的compareTo方法。规范是,如果调用对象较大,则应返回大于0的整数;如果调用者较小,则返回小于0的整数,否则返回0。
public class Employee implements Comparable {
//Rest of your class code here
public void getID() {
//return some value associated with the ID
}
//override this method
public int compareTo(Employee other) {
//code to compare two Employees
// Maybe something like the following
if (this.getID() > other.getID()) {
return 1;
} else if (this.getID() < other.getID()) {
return -1;
} else {
return 0;
}
}
}
答案 3 :(得分:1)
这是@Makoto
帮助下的最终答案public static void BubbleSort (ArrayList<Employee> empList) {
for (int i=0; i<empList.size()-1; i++) {
for (int j=0; j<4; j++) {
if (empList.get(j).getEmpNum() > empList.get(j+1).getEmpNum()) {
empList.add(j, empList.get(j + 1)); //This line inserts the smaller value
empList.remove(j+2); //into the first index and pushes the
} //indices down 1. So I need to remove
//j+2 not j+1.
/*When I use the debugger to step into toString() it says source not found.
I don't get it but it works.*/
System.out.println(empList.toString() + j + " << Second Loop Interation");
}
System.out.println(empList.toString() + i + " << First Loop interation");
}
}