有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据每个字符串的子字符串对字符串ArrayList的一半进行排序

例如,我有一个大小的字符串数组列表

[12,10L,10,10R,10S,10L]

输出应该是

[10S、10R、10L、10、12]

所以基本上大小必须先按数字排序(1,2,3,4,5…等等),然后按字母排序

我设法让这些数字进行排序,所以上面输入的当前输出是

10L,10,10R,10S,10L,12

如果缺少一个字母,那么它是最大的(参见上面的输出-10在10L-10S<;10R<;10L<;10<;12之后。)

我应该如何编写一个比较器来实现这一点

考虑输入数组,大小。此数组包含AB格式的产品尺寸,其中:

A是一个强制整数B是[S,R,L]中的可选字符大小必须先按A从最小到最大排序,然后按B按S的顺序排序


共 (2) 个答案

  1. # 1 楼答案

    如果它适用于您的测试用例,请尝试这个。如果需要,我们随时可以对其进行改进。(添加了一个助手方法)

    List<String> list = new ArrayList<>(Arrays.asList("12","10L","10","10R","10S","10L","14L","14","8","12S"));
    List<String> orderArray = new ArrayList<>(Arrays.asList("S", "R", "L"));
    
    List<String> sortedList = list.stream()
                .sorted(Comparator.comparing(str -> Integer.parseInt(((String)str).replaceAll("[A-Z]*","")))
                        .thenComparing(str -> getAnInt(orderArray, (String) str)))
                .distinct()
                .collect(Collectors.toList());
    
    System.out.println(sortedList);
    
    private int getAnInt(List<String> orderArray, String str) {
        int i = orderArray.indexOf(str.substring(str.length() - 1));
        if (i == -1) return Integer.MAX_VALUE;
        return i;
    }
    

    输出:[8、10S、10R、10L、10、12S、12、14L、14]

    如果不想使用流:

    List<String> list = new ArrayList<>(Arrays.asList("12","10L","10","10R","10S","10L","14L","14","8","12S"));
    List<String> orderArray = new ArrayList<>(Arrays.asList("S", "R", "L"));
    
    list.sort(new Comparator<String>() {
            @Override
            public int compare(String lhs, String rhs) {
                int lInt = Integer.parseInt(lhs.replaceAll("[A-Z]*", ""));
                int rInt = Integer.parseInt(rhs.replaceAll("[A-Z]*", ""));
                if (lInt != rInt) {
                   return lInt - rInt;
                } else {
                    return getAnInt(orderArray, lhs) - getAnInt(orderArray, rhs);
                }
            }
        });
    
    System.out.println(list);
    
  2. # 2 楼答案

    我假设finalList列表中有排序数据

    10L, 10, 10R, 10S, 10L, 12
    

    使用regex匹配整数,合并alphanumericsnumbers的列表

    在你的排序列表中,运行这个

    List<String> numberList= new ArrayList<String>(); // store number list
    List<String> sizeList= new ArrayList<String>(); // store alphanumerics
    for(String value: finalList){
    
      if(!value.matches("[0-9]+")){  // if contains characters
         sizeList.add(value);
       }
       else{
            numberList.add(value);
      }
    }
    
    sizeList.addAll(numberList); 
    

    sizeList有你需要的