使用负整数对一串数字进行排序

时间:2013-04-18 05:29:30

标签: java algorithm sorting

我已经搜了好两天了,但我没有成功,

现在我有7个整数的字符串(+和 - )用逗号分隔。

我写了一个示例代码来解释。

        ArrayList<String> str = new ArrayList<String>();

        str.add("9,-9,21,23,28,29,35");
        str.add("18,18,-21,28,28,32,34");
        str.add("-11,-11,22,28,29,-30,31");
        str.add("8,-8,26,31,31,31,31");
        str.add("8,8,26,-32,25,29,35");
        str.add("10,9,-21,45,25,29,35");
        str.add("-11,59,21,25,25,-29,35");
        str.add("12,-9,21,55,25,29,15");
        str.add("9,9,21,25,25,-29,35");
        str.add("7,9,21,25,-35,25,35");
        str.add("4,-39,21,-15,25,-29,35");
        str.add("9,9,21,25,27,29,-35");
        str.add("10,9,21,35,25,39,15");
        str.add("8,-9,21,-25,25,29,-35");
        str.add("18,-9,21,-23,25,29,-35");

        Collections.sort(str);

这不会返回正确的排序数组。它使用数字的第一个数字进行测试并继续进行排序。

但我想要的是,排序必须基于字符串中的第一个数字。只有当数字相同时(比如字符串数组的第一个数字中有3个),它应该检查那些中的第二个数字(单独绑定字符串)并相应地排序等等。

结果应为

9 , -9 , 21 , 23 , 28 , 29 , 35
9 , 9 , 21 , 25 , 25 , -29 , 35
9 , 9 , 21 , 25 , 27 , 29 , -35

是否有任何方法可以在此方法中进行排序。如果有任何相关答案欢迎,请告诉我。

提前致谢。

4 个答案:

答案 0 :(得分:2)

您正在使用不正确的数据类型来处理所需的排序语义。 Java看到你想要对字符串进行排序,所以它会对它们进行排序 - 通过词典排序,因为你没有告诉它不这样做。 Java不是读者:)

不像在“9,-9,21,23,28,29,35”中那样尝试对字符串进行排序,而是排序整数数组,如{9,9,-9,21,23,28, 29,35}。您仍然需要为比较器编写自己的逻辑,但现在它将相对简单,因为您不必进行任何字符串解析。

如果需要排序的数据以字符串格式到达程序,请在split上尝试',',然后将字符串数组的每个组件解析为int,最后将其全部转储到int中array或ArrayList。

答案 1 :(得分:1)

编写自定义排序逻辑并通过Collection#sort

Collections.sort(str, new Comparator<String>(){
                          public int compare(String str1, String str2){
                               // Write your logic
                               // @return a negative integer, zero, or a  
                              // positive integer as the first argument is less 
                              //  than, equal to, or greater than the second.
                          }
                      });

答案 2 :(得分:1)

使用此比较方法作为sort(List list, Comparator c)的比较器:

Collections.sort(str, new Comparator<String>(){                    
    public int compare(String str1, String str2){
      int result = 0;
      int i = 0;
      String [] s1 = str1.split(",");
      String [] s2 = str2.split(",");
      while ((i < s1.length) && (i < s2.length) && (result == 0)){
        result = (Integer.parseInt(s1[i]) - Integer.parseInt(s2[i]));
        i++;        
      }
      return (result);
    }
});

答案 3 :(得分:0)

您可以创建一个新类,例如NumberListString,将此字符串作为私有字段实现Comparable接口。提供适当的构造函数以及访问器/ mutator。

现在覆盖compareTo方法并为此比较提供逻辑。

然后进行排序使用Collections.sort(str)。这将按照要求的方式对列表进行排序。

或者,您可以动态创建匿名比较器并将其提供给Collections.sort方法。

注意:我将推荐第一种方法,因为它允许您抽象出您可能需要对此特定类型的字符串执行的其他操作。