【问题标题】:Sorting a list of String arrays对字符串数组列表进行排序
【发布时间】:2017-09-26 05:02:45
【问题描述】:

我收到一个字符串数组列表

String[] sa1 = {"120", "John" , "30" , "[\"science\",\"arts\"]"};
String[] sa2 = {"20", "Michael" , "29" , "[\"commerce\",\"engineering\"]"};
String[] sa3 = {"20", "Andrew" , "31" , "[\"science\",\"engineering\"]"};

我收到的列表包含这些类型的数组。 我目前用于排序的方法是:

Collections.sort(nameL, new Comparator<String[]>() {

        @Override
        public int compare(String[] o1, String[] o2) {


            return Arrays.toString(o1).compareTo(Arrays.toString(o2));
        }
    });

但这是基于 Ascii 字符排序的,因为数组是字符串类型。 问题是我不知道整数的位置

可以是:

sa1 = {"John", "120" , "30" , "[\"science\",\"arts\"]"};

但如果 sa1 是这样的,那么 sa2 和 sa3 也会在同一位置有整数

AIM是先排序,如果相同则第二个,依此类推:

期望的输出

{"20", "Andrew" , "31" , "[\"science\",\"engineering\"]"}
{"20", "Michael" , "29" , "[\"commerce\",\"engineering\"]"},
{"120", "John" , "30" , "[\"science\",\"arts\"]"}

【问题讨论】:

    标签: java arrays list sorting comparator


    【解决方案1】:

    你可以试试这样的

    Comparator<String[]> comparator = Comparator.comparing(array -> {
                                          try {
                                              return Integer.parseInt(array[0]);
                                          } catch (Exception ex) {
                                              return array[0];
                                          }
                                      });
    
    // if all arrays have equal first elements, use the next elements to sort on
    String[] firstArray = yourListOfArrays.get(0);
    // i starts at 1 because we've used 0 already to create the comparator
    for (int i = 1; i < firstArray.length; i++) {
        // i is changing on each iteration, so Java will not allow i
        // to be used inside a lamda
        int index = i;
        comparator.thenComparing(array -> try {
                                              return Integer.parseInt(array[index]);
                                           } catch (Exception ex) {
                                              return array[index];
                                 });
    }
    
    yourListOfArrays.sort(comparator);
    

    【讨论】:

      【解决方案2】:

      如果我正确地理解了你,你需要一个多标准排序,你的比较器的诀窍是索引 0 处的元素是表示整数的字符串,所以最好将它们解析为整数

          List<String[]> nameL = Arrays.asList(sa1, sa2, sa3);
          Collections.sort(nameL, (o1, o2) -> {
              if (o1[0].equals(o2[0])) {
                  if (o1[1].equals(o2[1])) {
      
                      return o1[2].compareTo(o2[2]);
      
                  } else {
                      return o1[1].compareTo(o2[1]);
                  }
              } else {
                  return Integer.compare(Integer.parseInt(o1[0]), Integer.parseInt(o2[0]));
              }
          });
          for (String[] strings : nameL) {
              System.out.println(Arrays.toString(strings));
          }
      

      【讨论】:

      • 表示整数的字符串的位置未知,可以在任意位置
      • @QO23 所有其他字符串都不是数字吗?
      • 我的意思是如果sa1 = {"20", "Andrew" , "31", "[\"science\",\"engineering\"]" 则所有其他字符串将具有相同的格式,如果sa1 = {"John", "120" , "30" , "[\"science\",\"arts\"]"} 在第二个位置具有字符串整数,则所有其他字符串将具有相同的格式字符串整数在其中的位置字符串数组未知
      • 我明白了你的意思,因为字符串数组的大小是未知的,所以我稍微修改了它并调用了一个递归函数,它从 if else 内部获取字符串数组和下一个比较索引,例如 @ 987654324@这解决了我的问题,谢谢
      【解决方案3】:

      你可以这样做。 首先找出您的 Integer 所在的位置。参考这个你知道你的字符串在哪里。然后先按String排序,再按Integer排序。

      public static void main(String[] args) {
      
          String[] sa1 = {"John", "120", "30", "[\"science\",\"arts\"]"};
          String[] sa2 = {"Michael", "20", "29", "[\"commerce\",\"engineering\"]"};
          String[] sa3 = {"Andrew", "20", "31", "[\"science\",\"engineering\"]"};
          String[] sa4 = {"Peter", "2020", "31", "[\"science\",\"engineering\"]"};
          String[] sa5 = {"Bob", "99", "31", "[\"science\",\"engineering\"]"};
          String[] sa6 = {"Frank", "333", "31", "[\"science\",\"engineering\"]"};
      
          List<String[]> nameL = new ArrayList<>();
          nameL.add(sa1);
          nameL.add(sa2);
          nameL.add(sa3);
          nameL.add(sa4);
          nameL.add(sa5);
          nameL.add(sa6);
      
          int positionInteger = 0;
          int positionString = 0;
      
          for (int i = 0; i < sa1.length; i++) {
              if (isNumeric(sa1[i])) {
                  positionInteger = i;
                  if(i == 0){
                      positionString = 1;
                  }
                  break;
              }
          }
      
      
          final int pInteger = positionInteger;
          final int pString = positionString;
      
          Collections.sort(nameL, new Comparator<String[]>() {
      
              @Override
              public int compare(String[] o1, String[] o2) {
                  return o1[pString].compareTo(o2[pString]);
              }
          });
      
      
          Collections.sort(nameL, new Comparator<String[]>() {
              public int compare(String[] o1, String[] o2) {
      
                  if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) == 0)
                  {
                      return 0;
                  }
      
                  if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) > 0)
                  {
                      return 1;
                  }
      
                  if(Integer.parseInt(o1[pInteger]) - Integer.parseInt(o2[pInteger]) < 0)
                  {
                      return -1;
                  }
      
                  return 0;
              }
          });
      
          for (String[] str : nameL) {
            System.out.println(Arrays.toString(str));
          }
      }
      
      private static boolean isNumeric(String value)
      {
          boolean isNumeric = false;
      
          try
          {
              int probe = Integer.parseInt(value);
              isNumeric = true;
      
          }catch(Exception e)
          {
              // do nothing
          }
      
          return isNumeric;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-31
        • 1970-01-01
        • 2015-03-26
        • 2017-10-28
        • 2016-07-18
        相关资源
        最近更新 更多