在Java中对字符串内的数字进行排序时删除重复项

时间:2020-08-24 14:14:17

标签: java string sorting duplicates

我需要对包含数字的字符串进行排序

例如:

 input : {"1","12","12","2","ABC","a"}

 Expected output: 1 2 12 a ABC

 My output  :1 2 12 12 a ABC 

我无法删除重复项。有人可以帮我吗?

下面是我用于排序的代码

public static String[] Sort(String[] list) {
    Comparator<String> comp = new Comparator<String>() {
        public int compare(String str1, String str2) {
            try {
                int num1 = Integer.parseInt(str1);
                int num2 = Integer.parseInt(str2);
                return Integer.compare(num1, num2);
            }
            catch (NumberFormatException e) {
                return str1.compareTo(str2);
            }
        }
    };
    Arrays.sort(list, comp);
    return list;
}

预先感谢

5 个答案:

答案 0 :(得分:1)

解决此问题的最简单方法是使用 。 这样我们就可以使用单行代码来解决这个问题。

String[] sorted = Arrays.stream(list).distinct().sorted((s1,s2)->compare(s1,s2)).toArray(String[]::new);

编辑:增加了给定比较器的使用,以完全支持数字字符串和其他字符串。

此外,比较器应在应用toLowerCase()之后比较字符串。结果

catch (NumberFormatException e) {
            return str1.toLowerCase().compareTo(str2.toLowerCase());
}

答案 1 :(得分:0)

Set可用于删除重复项

public static Set<String> sort(String[] list) {
    Comparator<String> comp = new Comparator<String>() {
        public int compare(String str1, String str2) {
            try {
                int num1 = Integer.parseInt(str1);
                int num2 = Integer.parseInt(str2);
                return Integer.compare(num1, num2);
            }
            catch (NumberFormatException e) {
                return str1.compareTo(str2);
            }
        }
    };
    Set<String> set = new TreeSet<String>(comp);
    set.addAll(Arrays.asList(list));
    System.out.println(set);
    return set;
}

答案 2 :(得分:0)

您还希望排序并删除重复项。这意味着比较器很难同时完成这两个过程,您需要在数组中获取不同的字符串,因此排序然后仅获取不同的字符串,有很多方法,但是我做到了,这很容易理解:

public static String[] Sort(String[] list) {
        Comparator<String> comp = new Comparator<String>() {
            public int compare(String str1, String str2) {
                try {
                    int num1 = Integer.parseInt(str1);
                    int num2 = Integer.parseInt(str2);
                    return Integer.compare(num1, num2);
                }
                catch (NumberFormatException e) {
                    return str1.compareTo(str2);
                }
            }
        };
        Arrays.sort(list, comp);
        ArrayList<String> new_list = new ArrayList<String>;
        if(list.length()>0){ 
          new_list.add(list[0]);
        }
        for(String s : list){
         //comparing with the last added string in list, if not same then add
          if(!new_list.get(new_list.size()-1).equals(s)){
             new_list.add(s);
           }
        }
        return new_list.toArray(new String[new_list.size()]);
    }

答案 3 :(得分:0)

尝试一下。我包括了一组更复杂的相同元素进行验证。

String[] vals = {"1","ABC","12","a", "1", "2", "12","2","ABC", "a", "ABC","a"};


Comparator<String> comp = ((a,b)-> {
   if (a.matches("\\d+") && b.matches("\\d+")) {
       return Integer.compare(Integer.valueOf(a), Integer.valueOf(b));
   } else {
            return a.toLowerCase().compareTo(b.toLowerCase());
   }
});

String[] result = Arrays.stream(vals).distinct().sorted(comp).toArray(String[]::new);
            
System.out.println(Arrays.toString(result));

打印

[1, 2, 12, a, ABC]

答案 4 :(得分:0)

您已经问了两个不同的问题! 首先讲:

<?php

  

      return [
    
         .....
    
         'providers' => [
    
             .....
    
             Anhskohbo\NoCaptcha\NoCaptchaServiceProvider::class
    
         ],
    
         'aliases' => [
    
             .....
    
             'NoCaptcha' => Anhskohbo\NoCaptcha\Facades\NoCaptcha::class,
    
         ]
    
      ]