我有一个类类型的ArrayList,特别是:
$ docker run --rm -it -v $PWD/mydockerkey:/root/.ssh/id_rsa ubuntu find /root/.ssh -type f
/root/.ssh/id_rsa
现在的输出是:
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));
是否可以针对row和col对升序进行排序?所以输出将是:
[(4,4,11),(1,1,11),(3,3,11),(1,0,11),(3,0,11)]
是否可以对列表中的列表进行排序,而不是在[(1,0,11),(1,1,11),(3,0,11),(3,3,11),(4,4,11)]
类中实现Comparable
或Comparator
?
答案 0 :(得分:4)
是的,您可以使用Comparator
方法实现此目的。它在Java 8中相当简洁:
Collections.sort(myList,
Comparator.comparingInt(RowColElem::getRow).thenComparingInt(RowColElem::getCol));
这将使用行进行比较,然后,如果它们相等,则使用列进行比较。 Comparator
接口有一些非常有用的静态和默认方法 - 值得仔细研究它。
答案 1 :(得分:1)
如果要在插入新元素时对集合进行排序,可能需要考虑使用TreeSet
或其他自排序结构而不是ArrayList
,具体取决于您的用例。迭代时,这两个结构自然会按排序顺序保持自己。否则,您可能必须实现自己的SortedList
类,它可以透明地插入排序。
无论哪种方式,您都必须在课堂上实施Comparable<RowColElem<T>>
。这是相当直接的。
@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;
}