Java 排序列表<;列表<;整数>&燃气轮机;按每个子列表中的第一个编号

Java 排序列表<;列表<;整数>&燃气轮机;按每个子列表中的第一个编号,java,list,sorting,arraylist,data-structures,Java,List,Sorting,Arraylist,Data Structures,我遇到了以下问题。我有一个数组列表(1)和一个数组列表(2)。我需要做的是,对结构进行排序,以便ArrayList(2)的第一个元素按升序向下排列ArrayList(1)。澄清: 输入: 3, 8, 6 2, 14, 205, 44, 1 1, 3 输出: 1, 3 2, 14, 205, 44, 1 3, 8, 6 看看它如何仅根据第一个值对行进行排序 目前,arraylist的arraylist为我定义的方式是: List<List<Integer>> graph

我遇到了以下问题。我有一个数组列表(1)和一个数组列表(2)。我需要做的是,对结构进行排序,以便ArrayList(2)的第一个元素按升序向下排列ArrayList(1)。澄清:

输入:

3, 8, 6
2, 14, 205, 44, 1
1, 3
输出:

1, 3
2, 14, 205, 44, 1
3, 8, 6
看看它如何仅根据第一个值对行进行排序

目前,arraylist的arraylist为我定义的方式是:

List<List<Integer>> graph = new ArrayList<List<Integer>>();
// and I add elements to it likewise
graph.get(currentIndex).add(new ArrayList<Integer>());
List graph=new ArrayList();
//我也同样添加了元素
get(currentIndex).add(newArrayList());

我之所以使用ArrayList,是因为我读到它比LinkedList更节省内存,而且因为我正在构建一个图的邻接列表列表。在这种情况下,每个节点的节点数或邻接列表的长度都可能不同。行的第一个元素是
start\u节点
,下面是它的相邻元素。你能告诉我如何实现这个排序吗

要比较2个子列表,您需要找到第一个不相等的对,并比较它们的值(如果两者都以like
32开头,则需要查看下一个值)


据我所知,您希望按照每个嵌套列表的第一个元素对顶级列表进行排序。这是正确的吗?以下是我将如何着手的:

List<List<Integer>> graph = new ArrayList<List<Integer>>();
// add a bunch of things ...
// ...

// Now, to sort:
graph.sort((x,y) -> Integer.compare(x.get(0), y.get(0)));
List graph=new ArrayList();
//添加一堆东西。。。
// ...
//现在,要排序:
graph.sort((x,y)->Integer.compare(x.get(0),y.get(0));
这是使用
Integer
获得
比较器,这是
sort()
方法根据某些自定义条件进行排序所需的。在本例中,我们告诉它对
列表
列表
进行排序,方法是比较
中的两个任意项,获取它们的第一个项,并像通常比较
整数
s那样进行比较


请注意,这假设
图中的所有项都有第一项。

因此,我提出了另一个解决方案

其思想是:使用集合的静态方法sort()并将其与对列表的引用和一个新的Comparator对象一起输入,该对象由我们compare()定义

Collections.sort(图形,新比较器(){
@凌驾
公共整数比较(列表aList1、列表aList2){
返回aList1.get(0).compareTo(aList2.get(0));
}
}));

内存效率更高
-尝试阅读
链接列表的优点,。对于邻接列表,您应该使用
LinkedList
。您可以将列表包装到一个对象中,然后实现
Comparable
接口。在里面,在
比较中
可以实现您的逻辑。另外,
LinkedList
具有更差的缓存位置,因此由于内存分配不连续,您可能会获得更差的性能。如果o1等于o2或其中一个是other@azro,我尝试了你的两种解决方案。最后的两个ifs意味着,如果两个列表中的所有元素都相等-返回的值更小,那么哪个更短?我的输入是2 4 | 1 3 | 5 47 99,我希望前两个切换顺序。对打印内容进行排序后:[][2,4,1,5,5,47,99]。我尝试了ArrayList和LinkedList,结果是一样的。顺便说一句,你可以更简洁(intellij建议用
graph.sort(Comparator.comparingit(x->x.get(0));
)替换我上面写的内容,但我喜欢上面的内容,因为它更容易理解,我不明白。好像我做错了什么。我得到一个索引越界异常。排序代码就是您建议的行<代码>列表的垂直长度:3//它确实是3
java.lang.IndexOutOfBoundsException:Index:0,Size:0位于java.util.ArrayList.rangeCheck(未知)位于java.util.ArrayList.get(未知源代码)位于BFS.lambda$main$0(BFS.java:113)我想解释一下,我的代码中有一个回归。你的想法非常完美,非常简短和优雅。我想出了另一个解决办法,我会在文章的末尾写下来。
graph.sort((o1, o2) -> {
    Comparator<List<Integer>> cc = Comparator.comparingInt(l -> l.get(0));
    int indice, min;
    for (indice = 0, min = Math.min(o1.size(), o2.size()); indice < min; indice++) {
        final int i = indice;
        cc = cc.thenComparingInt(l -> l.get(i));
    }
    return cc.thenComparingInt(List::size).compare(o1, o2);
});
List<List<Integer>> graph = new ArrayList<List<Integer>>();
// add a bunch of things ...
// ...

// Now, to sort:
graph.sort((x,y) -> Integer.compare(x.get(0), y.get(0)));
Collections.sort(graph, new Comparator<List<Integer>>(){
@Override
public int compare(List<Integer> aList1, List<Integer> aList2) {
   return aList1.get(0).compareTo(aList2.get(0));
}
}));