【问题标题】:Delete duplicated values from Map/HashMap and get the most frequent value从 Map/HashMap 中删除重复值并获取最频繁的值
【发布时间】:2017-12-04 14:22:12
【问题描述】:

我试图删除地图条目,但还没弄清楚怎么做,意思是我制作了另一张地图。

  1. 我需要在几个句子中找到出现的地方。 (我不知道 句子中可能出现的单词都没有)。
  2. 获取句子中出现次数最多的单词,无论大小写和重音。
  3. 获取句子中的第二个和第三个并发单词。
  4. 打印出现次数最多的并发单词。
  5. 尽可能高效。

第 5 点是最重要的,接下来你会看到我到目前为止的内容。

public class StringTest {

    public static void main(String[] args) {

        String stringTest = "En esta cadena tenemos mas cadenas que la cadena principal la primera vez que intente esta solucion no pude mas que intentar una y otra vez vez vez vez";
        new StringTest(stringTest);

    }

    public StringTest(String string) {

        String [] splitString = string.split(" ");
        Map<String, Integer> mapString = new HashMap<String, Integer>();
        mapString.put(splitString[0], 1);

        for (int i=1; i <= splitString.length-1; i++){
            if (mapString.containsKey(splitString[i])){
                mapString.put(splitString[i], mapString.get(splitString[i])+1);
            } else{
                mapString.put(splitString[i], 1);
            }
        }

        Map<String, Integer> newMap = new HashMap<String, Integer>();
        for (Entry<String, Integer> entry : mapString.entrySet()){
            if (entry.getValue()!=1){
                newMap.put(entry.getKey(), entry.getValue());
            }
        }

        System.out.println(newMap);
    }
}

【问题讨论】:

  • 几件事: 1. 为什么要把第一个元素放在地图中?我不会做“mapString.put(splitString[0], 1);”但是将循环更改为从 0 开始; 2. 您需要一个变量来保存 trim() 值。您正在检查 trim(),但将其放入未修剪的地图中。一个简单的“字符串键 = splitString[I].trim();”会工作。然后使用密钥。
  • 还有第 4 项:“打印出现次数最多的同时出现的单词”以读取他们希望出现次数最多的单词。也许我错了,但如果它是正确的,你可能需要对输出进行排序。
  • @Dakoda 1.- 我试图跳过执行“mapString.put(splitString[0], 1);”的 IF还尝试跳过循环的一次迭代。 2.-我留下了旧代码,不需要修剪,因为我对原始句子进行了拆分。关于您的第二条评论,我可以对输出进行排序,但是我不需要将所有键值保留在地图中,我只需要保持前 3 次出现即可。
  • 对不起。我没想到你在空间上分裂。你说得对。我的第二条评论只是一个建议。

标签: java hashmap memory-efficient


【解决方案1】:

您好,这是我使用您的示例的解决方案

public class StringTest {

public static void main(String[] args) {
    String stringTest = "En esta cadena tenemos mas cadenas que la cadena principal la primera vez que intente esta solucion no pude mas que intentar una y otra vez vez vez vez";
    new StringTest(stringTest);

}

public StringTest(String string) {

    String[] splitString = string.split(" ");

    Map<String, Integer> mapString = new HashMap<String, Integer>();

    // Loop the array
    for (String token : splitString) {
        // Convert token to lowerCase
        token = token.toLowerCase();
        if (mapString.containsKey(token)) {
            mapString.put(token, mapString.get(token) + 1);
        } else {
            mapString.put(token, 1);
        }
    }

    // Convert Map to List of Map
    List<Map.Entry<String, Integer>> list = new LinkedList<Map.Entry<String, Integer>>(mapString.entrySet());

    // Sort list with Collections.sort(), provide a custom Comparator
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {

        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            // o2 first that the order was descendant
            return (o2.getValue()).compareTo(o1.getValue());
        }
    });

    System.out.println("The most concurrent Word: " + list.get(0).getKey());
    System.out.println("The second word is: " + list.get(1).getKey() + ", an third is: " + list.get(2).getKey());
    System.out.println("The top concurrent words are");

    for (Entry<String, Integer> entry : list) {
        if (entry.getValue() > 1) {
            System.out.println(entry);

        }
    }
}

}

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多