在不使用 Collections.sort 的情况下对 ArrayList 中的对象进行排序
Sorting objects in an ArrayList without using Collections.sort
我想使用我自己的排序方法而不是 Collections.sort
,这样我就可以修改我的程序以更好地理解其他排序、泛型和 ArrayList
。
我有一个雇员 class,他有一个雇员编号 member。我知道如何制作 Employee 对象的 ArrayList
,但你能解释一下我如何打印和排序它们吗?我从对常规数组进行排序开始,并希望对 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));
}
这是员工 class。它还有其他的 getter 和 setter,但我没有包括它们。
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;
}
我注意到的一个问题是这一行 -
empList.get(j) > empList.get(j+1)
您正在比较 2 个对象,即 2 个员工对象,这通常不用于原始类型(例如 Integer)。
您可能想要比较的是我假设在您的 Employee.java 文件中的员工 ID(请 post 此文件以便我们查看)。这是您可以为此行执行的操作的示例 -
empList.get(j).getEmployeeId() > empList.get(j+1).getEmployeeId()
编辑:抱歉读错了问题,没有使用 Collections.sort()
这是一个例子。在这种情况下,您的 class 必须提供一种方法来覆盖 Comparable 接口中的 compareTo 方法。规范是如果调用对象更大,它应该 return 一个大于 0 的整数,如果调用者较小,它应该是一个小于 0 的整数,否则 return 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;
}
}
}
访问数组不同于访问ArrayList
。这是因为这两个对象根本不同。
让我们关注这行代码:
System.out.println(Arrays.toString(empList) + i + " << First Loop interation");
您需要为 Java 7 API 添加书签,以便您可以参考这些方法实际作为参数的内容。相信我,它会在漫长的 运行.
中为您节省大量时间
具体来说,代码无效,因为 toString
不接受 ArrayList
类型的参数。你可以直接 print 一个 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 代码中得到错误。原因:您使用方括号对数组进行索引,但对 ArrayList
.
使用 get
第一个修复是您无法将这两个实例与 >
进行比较。你最终要做的是检索你想要与之比较的字段。
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);
}
这是在@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");
}
}
我想使用我自己的排序方法而不是 Collections.sort
,这样我就可以修改我的程序以更好地理解其他排序、泛型和 ArrayList
。
我有一个雇员 class,他有一个雇员编号 member。我知道如何制作 Employee 对象的 ArrayList
,但你能解释一下我如何打印和排序它们吗?我从对常规数组进行排序开始,并希望对 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));
}
这是员工 class。它还有其他的 getter 和 setter,但我没有包括它们。
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;
}
我注意到的一个问题是这一行 -
empList.get(j) > empList.get(j+1)
您正在比较 2 个对象,即 2 个员工对象,这通常不用于原始类型(例如 Integer)。
您可能想要比较的是我假设在您的 Employee.java 文件中的员工 ID(请 post 此文件以便我们查看)。这是您可以为此行执行的操作的示例 -
empList.get(j).getEmployeeId() > empList.get(j+1).getEmployeeId()
编辑:抱歉读错了问题,没有使用 Collections.sort()
这是一个例子。在这种情况下,您的 class 必须提供一种方法来覆盖 Comparable 接口中的 compareTo 方法。规范是如果调用对象更大,它应该 return 一个大于 0 的整数,如果调用者较小,它应该是一个小于 0 的整数,否则 return 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;
}
}
}
访问数组不同于访问ArrayList
。这是因为这两个对象根本不同。
让我们关注这行代码:
System.out.println(Arrays.toString(empList) + i + " << First Loop interation");
您需要为 Java 7 API 添加书签,以便您可以参考这些方法实际作为参数的内容。相信我,它会在漫长的 运行.
中为您节省大量时间具体来说,代码无效,因为 toString
不接受 ArrayList
类型的参数。你可以直接 print 一个 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 代码中得到错误。原因:您使用方括号对数组进行索引,但对 ArrayList
.
get
第一个修复是您无法将这两个实例与 >
进行比较。你最终要做的是检索你想要与之比较的字段。
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);
}
这是在@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");
}
}