当前位置: 首页 > 知识库问答 >
问题:

Java排序列表的数组vs排序列表的列表

魏景龙
2023-03-14

我有一个点列表,每个点都是一个大小为2的小列表。我想按x的递增顺序对点列表进行排序,如果x值相等,我就按y的递减顺序排序来打破平局。

我编写了一个自定义比较器来对点进行排序,如下所示:

Collections.sort(points, (a, b) -> {
    if (a.get(0) != b.get(0)) {
        return a.get(0) - b.get(0);
    } return b.get(1) - a.get(1); 
});

以下是排序前的输入:

(2, 1000)
(9, -1000)
(3, 15)
(9, -15)
(5, 12)
(12, -12)
(5, 10)
(10001, -10)
(19, 8)
(10001, -8)

以下是使用上述比较器排序后产生的结果:

(2, 1000)
(3, 15)
(5, 12)
(5, 10)
(9, -15)
(9, -1000)
(12, -12)
(19, 8)
(10001, -10)
(10001, -8)

观察:-

  1. 输入按x的升序排序。
  2. (5,12)被正确地放在(5,10)之前
  3. (9,-15)被正确地放在(9,-1000)之前
  4. 然而,(10001,-10)放在(10001,-8)之前。尽管-8大于-10

我尝试了其他几种编写比较器的方法,比如使用Integer.compare(a, b)或者只是a.compareTo(t),但是得到了相同的结果。

最后,我将点的表示形式从列表中更改

Collections.sort(points, (a, b) -> {
    if (a[0] != b[0])
        return a[0] - b[0];
    return b[1] - a[1];
});

排序前输入:

(2, 1000)
(9, -1000)
(3, 15)
(9, -150
(5, 12)
(12, -12)
(5, 10)
(10001, -10)
(19, 8)
(10001, -8)

排序后:

(2, 1000)
(3, 15)
(5, 12)
(5, 10)
(9, -15)
(9, -1000)
(12, -12)
(19, 8)
(10001, -8)
(10001, -10)

所以数组列表的排序是正确的,因为(10001,-8)被正确地放在(10001,-10)之前。

我不明白为什么改变点的表示方式可以解决这个问题,从而解决这个问题。如果需要,我可以提供更多关于如何创建积分列表的详细信息。


共有1个答案

鄢禄
2023-03-14

我错过了一些微不足道的东西

方法equals()应用于对象比较。Double equals==检查两个引用是否指向内存中的同一对象。

将比较器内的条件更改为!a、 得到(0)。等于(b.get(0))

所以数组列表的排序是正确的,因为(10001,-8)被正确地放在(10001,-10)之前。

这种行为的原因是JVM在[-128; 127]范围内兑现了整数(以及Byte简短)的所有实例。并且因为在您的示例中,像3512这样的小值将由一个对象表示,它们与=进行比较没有问题。但是对于两个具有值10001整数实例,与=进行比较的结果将是false,因为在这种情况下将有两个不同的对象。

 类似资料:
  • 问题内容: 如何使用Collections.sort()或其他排序方法按字典顺序对Java中的列表列表进行排序? 问题答案: 您将必须实现自己的类并将实例传递给 然后分类很容易

  • 问题内容: 我为无法快速找到答案感到困惑。我本质上是在寻找Java中的一种实现接口的数据结构,但该结构按顺序存储其成员。我知道您可以使用法线并在其上使用,但是我遇到的情况是,我偶尔会添加并经常从列表中检索成员,并且我不想每次检索成员时都对其进行排序,以防万一新增加了一个。谁能指出我在JDK甚至第3方库中都存在的这种东西? 编辑 :数据结构将需要保留重复项。 总结 :我发现所有这些都很有趣,并且学到

  • 问题内容: 我有以下课程。在此,虹膜是具有某些属性的另一类。 我想对此数组列表进行排序(即列表 helperList),基于距离参数降序。我已经编写了以下方法,但是它不起作用。 有人可以提出解决方案吗? 问题答案: 为什么不让您的类实现接口,然后使用Collections类提供的内置排序方法。 我认为这可以解决问题。另外,此方法是稳定的。 http://docs.oracle.com/javase

  • 我有一个java中的double列表,我想按降序排列ArrayList。 输入ArrayList如下所示: 输出应该是这样的

  • 我想用java对数字数组列表进行排序,所以基本上如果我有以下数组列表: 输出应为: arraylist应该根据第一个键然后第二个键进行排序。