在Java中,如何对排序字段为多层的ArrayList对象进行快速排序?

在Java中,如何对排序字段为多层的ArrayList对象进行快速排序?,java,arrays,sorting,arraylist,quicksort,Java,Arrays,Sorting,Arraylist,Quicksort,基本上,我有一个名为“Employees”的容器类,其中有一个ArrayList。此ArrayList包含“Employee”对象,这些对象依次包含“EmployeeData”对象,这些对象依次包含字符串对象,如“first”或“last”(员工姓名) 以下是ArrayList结构图: ArrayList[Employee] emps ==> 1:Many ==> Employee emp Employee emp ==> 1:1 ==> EmployeeData dat

基本上,我有一个名为“Employees”的容器类,其中有一个ArrayList。此ArrayList包含“Employee”对象,这些对象依次包含“EmployeeData”对象,这些对象依次包含字符串对象,如“first”或“last”(员工姓名)

以下是ArrayList结构图:

ArrayList[Employee] emps ==> 1:Many ==> Employee emp
Employee emp ==> 1:1 ==> EmployeeData data
EmployeeData data ==> 1:2 ==> String last // A string that contains employee's last name.
我究竟该如何对ArrayList执行快速排序,以便其中的“Employee”对象按照字符串对象“last”的字母顺序排列?看起来有点复杂


以下是我的课程的基本设计:

class Employees{
    //data:
        private ArrayList<Employee> emps = new ArrayList<Employee>();

    //Some constructors go here

    //Methods to add, remove, toString, etc, go here

    public /*output a sorted ArrayList?*/ sort(){
        // Some kind of "quicksort" in here to modify or create a new ArrayList sorted by employee's las name...
    }
}

class Employee{
    //data:
    EmployeeData data;
    // Some methods to construct and modify EmployeeData data.
}

class EmployeeData{
    //data:
        String first, last; // I wish to sort with "last". How do you do it?
        double payrate, hours;
    //...methods...
}
类员工{
//数据:
private ArrayList emps=new ArrayList();
//有些建筑工人到这里来
//添加、删除、toString等方法,请转到此处
public/*输出已排序的ArrayList?*/sort(){
//这里使用某种“快速排序”来修改或创建一个按员工姓名排序的新ArrayList。。。
}
}
班级员工{
//数据:
员工数据;
//构造和修改EmployeeData数据的一些方法。
}
类雇员数据{
//数据:
String first,last;//我想用“last”排序。您是怎么做的?
双倍工资率,小时;
//…方法。。。
}

如您所见,这些是类。我不知道如何在“Employees”类中实现“sort”,以便它根据“EmployeeData”类的“last”变量对ArrayList进行排序。

定义
员工实现可比的


compareTo
方法中,深入挖掘层并比较所需的字符串。然后,您可以使用
Collections.sort()
,也可以将数据存储在自然排序的
SortedSet
中。

您可以制作一个比较器,类似于:

public class MyComparator implements Comparator<Employee>
{
  public int compare(Employee e1, Employee e2)
  {
    return e1.getData().getLast().compareTo(e2.getData().getLast());
  }
}
或者,您可以使用TreeSet使用此比较器在插入时进行排序,或者使用集合或SortedSet将员工作为可比较对象进行排序

public class Employee implements Comperable<Employee>
{
  ...
  public int compareTo(Employee e)
  {
    return this.getData().getLast().compareTo(e.getData().getLast());
  }
  ...
}
public类Employee实现Competable
{
...
公共内部比较(员工e)
{
返回这个.getData().getLast().compareTo(例如getData().getLast());
}
...
}

最佳做法是将排序逻辑封装在ArrayList中存储的类中,在本例中为Employee。通过创建compareTo(Employee)方法实现Comparable


Peter DeWeese和其他人给了你非常好的答案。你可以用

Collections.sort(myList, new MyComparator());
要使用您定义的比较器对myList进行排序。这太棒了,因为您可以将Employee对象存储到ArrayList中的每个条目中。到目前为止还好吗

但是,如果要对对象进行排序,首先必须定义顺序。由于对象可以有各种属性,也许我想按耳朵大小对员工进行排序。在本例中,我只告诉Java我的类实现了Comparable。对于泛型,我必须指定它实现Comparable,因为我正在为我的Employee对象(牡丹、仆从等)定义一个顺序

Peter DeWeese提到:

 public int compareTo(Employee e)
 {
     return this.getData().getLast().compareTo(e.getData().getLast());
 }
public int compareTo(Employee other)
{
    return Data.Last.compareTo(other.Data.Last);
}
Jason Goemaat提到:

 public int compareTo(Employee e)
 {
     return this.getData().getLast().compareTo(e.getData().getLast());
 }
public int compareTo(Employee other)
{
    return Data.Last.compareTo(other.Data.Last);
}
这到底是什么意思?如果我说我的类实现了Comparable,那么我需要定义一个compareTo函数。(接口是需要实现的方法的集合)函数compareTo定义元素的顺序

根据可比的规范:

int compareTo(to)

将此对象与订单的指定对象进行比较。当此对象小于、等于或大于指定对象时,返回负整数、零或正整数

如果我比较耳朵的大小,假设我想让大耳朵排在列表的第一位,那么我可以(重新)将compareTo定义为:

public int compareTo(Employee e)
{
    if (this.earSize > e.earSize) //big ears come first
        return -1;
    if (this.earSize == e.earSize) //equality
        return 0;
    else
        return 1; // if e.earSize > this.earSize then return 1
}
为了回答Steve Kuo的问题,我们将关键字this放在我们的比较器中,因为当我们调用compareTo方法时

x.compareTo(y); 
关键字将引用x

您可以将compareTo视为对象x的一种方法,因此当您调用x.compareTo(y)时,实际上是这样说的。compareTo(y)在对象x的范围内

我们还可以看一个字符串示例:

这意味着,如果我想让“梅德韦杰夫”排在“普京”之前(英语字母表中“M”排在“p”之前),我必须声明,在将梅德韦杰夫与普京进行比较时,我希望compareTo返回-1

String TheMString = "Medvedev";
String ThePString = "Putin";
然后排队

TheMString.compareTo(ThePString);
将评估为-1

现在,一个标准例程,如Collections.sort(list,comparator)将能够使用compareTo返回的这些值来计算list的[绝对]顺序。如您所知,排序是一种基于比较的操作,我们需要知道什么值“小于”或“大于”另一个值才能进行有意义的排序

一个大的警告是,如果您在字符串上调用compareTo,它默认为字母顺序,因此您可以简单地告诉compareTo返回A.compareTo(B),它将确保字符串顺序正确

通常(我应该说,在其他情况下)在重新定义compareTo方法时,必须显式地声明一个neg/zero/pos返回值


我希望这能有所帮助。

我不太清楚你的确切意思。我以前从未这样做过。我已经更新了我的问题库,包括我的课程的基本布局。你能看看我想做什么吗?嘿,谢谢你提供的信息,但我不知道如何实现它。我不知道我该怎么做。你能看看我上面的(更新的)问题,了解我的课程和我想做什么吗?好的,首先,你知道Java吗?我只是在学习,已经学了4周了。杰森给出了一个很好的答案。如果你的答案是什么意思,我可能不会问这个问题谢谢你,杰森!多好的回答啊。这应该让我开始。只是出于好奇,Collections.sort()是否实现了快速排序?不,它实现了“m”
TheMString.compareTo(ThePString);