Java 对arraylist中的对象进行排序

Java 对arraylist中的对象进行排序,java,sorting,arraylist,Java,Sorting,Arraylist,我有一个类类型的ArrayList,特别是: ArrayList<RowColElem<T>> myList = new ArrayList<RowColElem<T>>(); myList.add(new RowColElem(4,4,11)); myList.add(new RowColElem(1,1,11)); myList.add(new RowColElem(3,3,11)); myList.add(new RowColElem(1,0

我有一个类类型的ArrayList,特别是:

ArrayList<RowColElem<T>> myList = new ArrayList<RowColElem<T>>();
myList.add(new RowColElem(4,4,11));
myList.add(new RowColElem(1,1,11));
myList.add(new RowColElem(3,3,11));
myList.add(new RowColElem(1,0,11));
myList.add(new RowColElem(3,0,11));
可以按行和列的升序对myList进行排序吗?因此,输出将是:

[(1,0,11),(1,1,11),(3,0,11),(3,3,11),(4,4,11)]

如果您想在插入新元素时保持集合的排序,是否可以在其所在的类中对列表进行排序,而不是在
**rowcolem**
类中实现
Comparable
Comparator
,根据您的用例,您可能需要考虑使用<代码>树集> /COD>或另一个自排序结构,而不是<代码> ARARYLISTAB/COD>。当迭代时,这两个结构自然会保持其排序顺序。否则,您可能必须实现自己的
SortedList
类,该类透明地执行插入排序

无论哪种方式,您都必须在类上实现
compariable
。这相当直截了当

@Override
public int compareTo(RowColElem<T> o) {

    int rowComp = Integer.compare(this.row, o.row);

    if (rowComp == 0) {
        return Integer.compare(this.column, o.column);
    }

    return rowComp;
}
@覆盖
公共内部比较(Rowcolem o){
int rowComp=Integer.compare(this.row,o.row);
如果(rowComp==0){
返回整数.compare(this.column,o.column);
}
返回rowComp;
}

< /代码> 如果要在插入新元素时保持集合的排序,则可能需要考虑使用<代码> TeSeSe<代码>或另一个自排序结构,而不是使用<代码> ARRAYList,这取决于您的用例。当迭代时,这两个结构自然会保持其排序顺序。否则,您可能必须实现自己的
SortedList
类,该类透明地执行插入排序

无论哪种方式,您都必须在类上实现
compariable
。这相当直截了当

@Override
public int compareTo(RowColElem<T> o) {

    int rowComp = Integer.compare(this.row, o.row);

    if (rowComp == 0) {
        return Integer.compare(this.column, o.column);
    }

    return rowComp;
}
@覆盖
公共内部比较(Rowcolem o){
int rowComp=Integer.compare(this.row,o.row);
如果(rowComp==0){
返回整数.compare(this.column,o.column);
}
返回rowComp;
}

您必须实现可比较的接口,并且您的类RowColElement必须提供compareTo方法的实现,如果您不想实现这些接口,则必须扩展ArrayList并提供自己的实现。这不是一个好主意,最好的方法是实现接口并提供自定义比较逻辑

您必须实现可比较的接口,并且您的类RowColElement必须提供compareTo方法的实现,如果不想实现这些接口,则必须扩展ArrayList并提供自己的实现。这不是一个好主意,最好的方法是实现接口并提供自定义比较逻辑

是的,您可以使用
比较器
方法实现这一点。它在Java 8中相当整洁:

Collections.sort(myList, 
    Comparator.comparingInt(RowColElem::getRow).thenComparingInt(RowColElem::getCol));

这将使用行进行比较,如果它们相等,则使用列进行比较。
Comparator
接口有一些非常有用的静态和默认方法-值得仔细研究一下。

是的,您可以使用
Comparator
方法实现这一点。它在Java 8中相当整洁:

Collections.sort(myList, 
    Comparator.comparingInt(RowColElem::getRow).thenComparingInt(RowColElem::getCol));

这将使用行进行比较,如果它们相等,则使用列进行比较。
Comparator
接口有一些非常有用的静态和默认方法-值得仔细研究一下。

@JBNizet谢谢,我从来都不知道关于
PriorityQueue
。我用你的建议修正了我的答案。行和列应该是实例变量吗?@JBNizet谢谢,我从来不知道关于
PriorityQueue
。我用你的建议修正了我的答案。行和列应该是实例变量吗?可能是@RC的重复。不是真的。这个问题还询问如何按多个条件排序,而不仅仅是如何使用自定义属性。这是一个完全不同的问题,在您链接的问题中没有回答。所以在“Arraylist”中有一个“add”方法,它需要三个整数?看起来不对,但我知道什么…@sprinter的答案是一样的,使用自定义比较器。(注意:我对你的答案投了赞成票,因为它增加了一些东西)可能是@RC的重复。不是真的。这个问题还询问如何按多个条件排序,而不仅仅是如何使用自定义属性。这是一个完全不同的问题,在您链接的问题中没有回答。所以在“Arraylist”中有一个“add”方法,它需要三个整数?看起来不对,但我知道什么…@sprinter的答案是一样的,使用自定义比较器。(注:我对你的答案投了赞成票,因为它增加了一些东西)