在不使用 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");

        }


    }