【问题标题】:Removing duplicates while sorting numbers inside a String in java在java中对字符串中的数字进行排序时删除重复项
【发布时间】:2020-12-13 04:46:09
【问题描述】:

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

例如:

 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;
}

提前致谢

【问题讨论】:

标签: java string sorting duplicates


【解决方案1】:

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

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());
}

【讨论】:

  • 我认为这是对的,但它并没有给出想要的输出,这可能是内置函数无法实现的......
  • 在比较器中添加toLowerCase() 后,这是有效的,因此是最正确的答案。我正要编辑我的,因为我通过拆分数字字符串和字母字符串并分别处理它们来工作,但这比这种更优雅的方法要复杂得多。我会将其删除,以免误导将来可能会检查此问题的人。
  • 以上无法编译。
  • @WJS 谢谢,我修复了代码中的语法错误。确保在使用流时导入所需的库(全部在 java.util.* 下)
  • 不客气。但我主要指的是sorted 方法中的Comparatorcompare 需要有资格。
【解决方案2】:

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;
}

【讨论】:

  • 设置不保留顺序!!
  • 然而最终结果预计会被排序并且不需要顺序
【解决方案3】:

您想要排序以及删除重复项。这意味着比较器很难同时做到这两个过程,你需要在数组中得到不同的字符串,所以排序然后只得到不同的,有很多方法,但我做了这很容易理解:

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()]);
    }

【讨论】:

    【解决方案4】:

    试试这个。我包含了一个更复杂的相同元素数组来验证。

    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]
    

    【讨论】:

      【解决方案5】:

      你问了 2 个不同的问题! 向第一个发誓:

      Comparator<String> comparator = new Comparator<String>() {
              
              public int compare(String str1, String str2) {
                  return isInteger(str1) && isInteger(str2)
                         ? Integer.compare(num1, num2)
                         : isInteger(str1) 
                         ? -1
                         : isInteger(str2)
                         ? 1
                         : str1.compareTo(str2);
              }
          };
      
      private boolean isInteger(String value) {
          try {
              Integer.parseInt(value);
              return true;
          }
          catch (NumberFormatException e) {
              return false;
          }
      

      【讨论】:

        猜你喜欢
        • 2014-04-29
        • 1970-01-01
        • 2021-11-19
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 2018-08-11
        相关资源
        最近更新 更多