如何从哈希映射中找到最高键值

7

使用最大键值进行迭代,以便替换最大字符串值。首先,我的代码是:

HashMap<String, String> mapp=new HashMap<String, String>();
mapp.put("ab","blue");
mapp.put("abc","black");
mapp.put("abcd","pink");
for (Iterator it = alltyp.iterator(); it.hasNext();) {
    String finalstring = (String) it.next();

    Iterator it1=mapp.entrySet().iterator();
    while(it1.hasNext())
    {
        Map.Entry pairs = (Map.Entry) it1.next();
        String key_ = (String) pairs.getKey();
        String value_ = (String) pairs.getValue();
        finalstring = finalstring.replaceAll(key_, value_);      
    }
}

我希望可以按照最大键值进行迭代,这意味着应该首先迭代键值为"abcd",然后是"abc",最后是"ab"。

3个回答

13

这里是使用Collections.max()的示例。如果您想要自定义排序,还可以传递比较器。

HashMap<String, String> mapp=new HashMap<String, String>();
mapp.put("ab","blue");
mapp.put("abc","black");
mapp.put("abcd","pink");

// find max key alphabetically
String maxKey = Collections.max(mapp.keySet());


Comparator<String> strLenCmp = new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return Integer.compare(o1.length(), o2.length());
    }
};

// find max key by key length
String longKey = Collections.max(mapp.keySet(), strLenCmp);

编辑: 添加了使用自定义比较器的示例


如何传递比较器? - user3441816
更新了带有比较器代码片段的答案。如果您对此满意,请接受答案。 - David Roussel
谢谢您的回答,但是在比较时出现了错误。我想要先迭代更大的键值(即按降序排列),这样我的replaceall函数就可以先替换更大的值。请给出您的建议。 - user3441816
我给出的例子在我的电脑上编译正常。你遇到了什么错误?如果你想找到最大的键,字符串的默认比较器可能是你需要的。 - David Roussel

2
使用泛型,摆脱强制类型转换。这将大大整理您的代码。
您需要一个自定义比较器来进行排序。
一旦有了比较器,您有两个选择:
选项1:
创建一个ArrayList,将所有键从map中放入其中。
对ArrayList进行排序,迭代排序后的ArrayList。
选项2:
使用TreeMap存储数据。

这个目的最好使用TreeMap。 - David Roussel
@DavidRoussel TreeMap 的缺点是你只能使用一种排序方式。使用选项1,你可以按多种方式对相同的数据进行排序,因此值得同时拥有这两个选项。 - Tim B
很好的观点,Tim。我已经发布了一个使用Collections.max()的示例答案。 - David Roussel

0
尝试使用TreeMap而不是HashMap,它具有获取最后一个条目的方法,该方法将给您具有最高键值的条目。即使在TreeMap中,如果您传递自定义比较器,则它将以一种方式排序,以便首先获得具有最大值的键,因此您不必担心它。
请参考此链接TreeMap - lastEntry和lastEntry方法。

你只需要使用keySet()方法获取键的条目列表并进行迭代。 - Bilbo Baggins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接