【问题标题】:Classifying and grouping strings in array in JavaJava中对数组中的字符串进行分类和分组
【发布时间】:2018-04-17 10:30:34
【问题描述】:

我需要找出如何对字符串数组进行分类和分组的最佳方法。假设我有数组:

Resources[] = {tester1,tester2,solverC1,solverC2,solverS2,solverS1,tester3,tester4,system}

实际上它更多的是字符串,但它的想法是这样的。 我需要得到答案,在这种情况下我有资源:

Resource: tester || Quantity: 4
Resource: system || Quantity: 1
Resource: solver || Quantity: 4

使用 Levenshtein Distance 是不是最好的主意? 如果是的话,也许有些人有想法将数组分组并获取名称(不包括数字或字母)并计算它们的数量?

【问题讨论】:

    标签: java grouping similarity levenshtein-distance


    【解决方案1】:

    您可以使用 java 流来获得带有值的漂亮地图。例如:

    List<String>  res= Arrays.asList("tester1","tester2","solverC1","solverC2","solverS2","solverS1","tester1","tester4","system");
    
    Map<String,Long> result=res.stream().collect( Collectors.groupingBy(s-> s.replaceAll("\\d","").toString(),  Collectors.counting()));
    

    将保留以下值:system="1"、tester="4"、solverS="2"、solverC="2"

    我使用了 groupBy 函数,它只从字符串中删除数字,但你可以在这里定义任何你想要的规则:

    Collectors.groupingBy(s-> s.replaceAll("\\d","").toString()
    

    取决于您是否希望solverS不同于solverC

    工作示例:

    public class MainClass {
        public static void main(String[] args) {
            System.out.println(new Date()+": Let's start our StackOverflow helper project!");
    
                    List<String>  res= Arrays.asList("tester1","tester2","solverC1","solverC2","solverS2","solverS1","tester1","tester4","system");
    
    
                    Map<String,Long> reuslts=res.stream().collect( Collectors.groupingBy(s-> s.replaceAll("\\d","").toString(),  Collectors.counting()));
    
                     StringBuilder sb = new StringBuilder();
                    Iterator<Entry<String, Long>> iter = reuslts.entrySet().iterator();
                    while (iter.hasNext()) {
                        Entry<String, Long> entry = iter.next();
                        sb.append(entry.getKey());
                        sb.append('=').append('"');
                        sb.append(entry.getValue());
                        sb.append('"');
                        if (iter.hasNext()) {
                            sb.append(',').append(' ');
                        }
                    }
                    System.out.println(sb.toString());
    
        }   
    
    }
    
    // It should print system="1", tester="4", solverS="2", solverC="2"
    

    【讨论】:

    • 不知何故无法使用,能否提供完整代码?
    • 这两行是工作代码。我也会提供打印部分来检查结果
    • 哦,太好了,现在我明白了。一切正常。谢谢你:))
    【解决方案2】:

    您可以使用流进行映射:

    String Resources[] = 
       new String[]{"tester1",
                    "tester2","solverC1","solverC2",
                    "solverS2","solverS1",
                    "tester3","tester4","system"};
    
    Map<String, List<String>> groups = Arrays.asList(Resources)
        .stream().collect(
                Collectors.groupingBy(
                        t -> t.contains("tester") ? "tester" : 
                            (t.contains("solver") ? "solver" : "system"),
                        Collectors.counting()));
    

    这将返回一个地图,其结果如下:

    {system=1, tester=4,solver=4}

    这可以通过一种方法变得更干净:

    private static String group(String t) {
        return t.contains("tester") ? "tester" : (t.contains("solver") ? "solver" : "system");
    }
    

    所以收集器可以使用:

    Collectors.groupingBy(Main::group, , Collectors.counting())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 2022-01-01
      • 2017-07-01
      • 2020-02-05
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多