【问题标题】:sort list of int[] in javajava中int []的排序列表
【发布时间】:2016-05-23 22:50:14
【问题描述】:

我想在java中对一个int数组列表进行排序,具体如下:

1, 2
1, 3
2, 3
1, 4
2, 4
3, 1

应归类为:

1, 2
1, 3
1, 4
2, 3
2, 4
3, 1

我阅读了其他一些帖子,并一直在尝试使用类似的东西来回答排序String[]

Collections.sort(listOfStringArrays,new Comparator<String[]>() {
        public int compare(String[] strings, String[] otherStrings) {
            return strings[1].compareTo(otherStrings[1]);
        }
    });

把它改成:

Collections.sort(listOfIntArrays,new Comparator<int[]>() {
        public int compare(int[] ints, int[] otherInts) {
            return ints[0].compareTo(otherInts[0]);
        }
    });

但这不起作用,错误是返回行Cannot invoke compareTo(int) on the primitive type int

谁能帮帮我。

【问题讨论】:

  • 要清楚,它实际上是一个String[] 而不是两个int[]
  • 您可以通过&lt;&lt;===直接比较ints。 &gt;=&gt;。此外,如果它们与第二个元素相同,您可能希望首先按第一个元素 ant 排序。关于什么时候返回什么的细节,看看the correspondig Javadoc
  • @4castle 这是两个int[]String[] 代码是我在该站点的另一篇文章中找到的,并且一直在尝试更改它以使其适用于int[]。 @Turing85 我怎么能做到这一点?我对 Java 还很陌生,一直在尝试阅读更多文档,但我不知道该怎么做。
  • @CConard96 会因为Autoboxing而过度设计并变慢。

标签: java arrays sorting arraylist


【解决方案1】:

出现此错误是正常的,因为只能从 Integer 对象调用 .compareTo(Integer) 方法。但在你的情况下,你有原始的 int 元素。

为了进行比较,您可以像这样调用Integer.compare(int, int) 方法:

而不是

return ints[0].compareTo(otherInts[0]);

使用

return Integer.compare(ints[0], otherInts[0]);

你可以看看Integer#compare方法说明

根据两个值排序

如果您想同时对第一个和第二个值进行排序,您可以通过创建一个两位数字(假设每个值都是 0-9 范围内的一个数字)将两个值简单地转换为一个。

我建议你这样做

return Integer.compare(ints[0] * 10 + ints[1], otherInts[0] * 10 + otherInts[1]);

【讨论】:

  • 我喜欢这个比我转换为整数数组的建议要好得多。 +1
  • 您可能希望将ints[0]otherInts[0] 进行比较,因为您想按第一个元素而不是第二个元素进行排序。
  • @Turing85 是的,我刚刚用注释编辑了我的问题并更正了该部分。我想按第一个字段排序。
  • 使用此解决方案,它会根据第一个字段对int[] 进行排序,但现在是第二个。是否有可能同时基于两个字段进行排序?
  • @gptt916 是的。您需要在Comparator 中添加更多逻辑。见my original comment for details
【解决方案2】:

正如@tfosra 所说,您应该改用Integer.compare(int, int)。但是,我建议在排序时使用不同的方法将第一个数组优先于第二个数组。如果第一个数组包含相等的值,则比较第二个数组中的值。这不会将范围限制为 0-9,并且可能更具可读性。

return ints[0] != otherInts[0]
           ? Integer.compare(ints[0], otherInts[0])
           : Integer.compare(ints[1], otherInts[1]);

【讨论】:

  • 没错,这让解决方案更加灵活
猜你喜欢
  • 2011-04-13
  • 2012-03-09
  • 2016-06-16
  • 2012-12-08
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2022-11-17
相关资源
最近更新 更多