在Java中查找HashSet/HashMap中最大的数

29

我想在HashSet和HashMap中找到最大的数。假设我有数字[22,6763,32,42,33]在我的HashSet中,我想找到当前HashSet中最大的数。我应该怎么做?同样的,对于HashMap也是如此。希望你能帮助我。谢谢。


4
如果你需要这样做,那么你可能不应该使用基于哈希的集合。 - David Schwartz
8个回答

78
您可以使用 Collections.max(Collection) 方法从任何集合中找到最大元素。 同样地,对于一个 HashMap ,您可以在其 keySet()values() 上使用相同的方法,具体取决于您是想要最大键还是最大值。
此外,如果您想这样做,可以使用 TreeSetTreeMap 代替,在这些容器中,元素按排序后的键顺序存储。

哇..谢谢..这很有帮助。:) - user2064467
2
不要忘记,当集合为空时,max()会抛出NoSuchElementException异常。 - gladed

12

尝试

    int max = Collections.max(set);
    int maxKey = Collections.max(map.keySet());
    int maxValue Collections.max(map.values());

7
如果你被迫使用HashSet/HashMap,那么你必须扫描整个HashSet/HashMap才能找到最大值。像Collections.max()这样的库函数就是这样做的。
如果你想要O(1)检索最大值,并且可以更改所使用的集合类型,那么请使用排序的集合/映射(例如TreeSet/TreeMap)。

O(1)仅适用于映射键;对于值,必须先构建一个单独的集合,因此它再次变为O(n),具有非常糟糕的常数因子。 - Marko Topolnik
请注意,TreeSet 在插入和删除时变得更加昂贵。因此,请明智地选择正确的实现方式。 - Shiva Kumar

2

类似这样的:

Set<Integer> values = new HashSet<Integer>() {{
    add(22);
    add(6763);
    add(32);
    add(42);
    add(33);
}};
int maxValue = Integer.MIN_VALUE;
for (int value : values) {
    if (value > maxValue) {
        maxValue = value;
    }
}

并且这个:

Map<String, Integer> values = new HashMap<String, Integer>() {{
    put("0", 22);
    put("1", 6763);
    put("2", 32);
    put("3", 42);
    put("4", 33);
}};
int maxValue = Integer.MIN_VALUE;
for (int value : values.values()) {
    if (value > maxValue) {
        maxValue = value;
    }
}

初始化HashMap的方法太糟糕了,只为了这个简单的目的就必须创建一个新类。每次我在处理代码时看到它,我都很讨厌。 - Kamil
1
有什么可怕的?我看不出有什么伤害。 - duffymo
我上面写的代码是为了创建只有几个元素的map而专门创建一个新类。这种方法非常慢(在stackoverflow上已经有测试验证)。 - Kamil
我永远不会相信这会成为任何应用程序的瓶颈。这是最糟糕的微观优化。 - duffymo

0
这里有一个简单的方法可以实现你所要求的功能:
  public String getMapKeyWithHighestValue(HashMap<String, Integer> map) {
    String keyWithHighestVal = "";

    // getting the maximum value in the Hashmap
    int maxValueInMap = (Collections.max(map.values()));

    //iterate through the map to get the key that corresponds to the maximum value in the Hashmap
    for (Map.Entry<String, Integer> entry : map.entrySet()) {  // Iterate through hashmap
        if (entry.getValue() == maxValueInMap) {

            keyWithHighestVal = entry.getKey();     // this is the key which has the max value
        }

    }
    return keyWithHighestVal;
}

0
在TreeMap的情况下,如果您知道键/值是随机插入的,则树将更或多或少地平衡。如果数据按已排序的顺序插入,则树会变得不平衡,失去了快速查找(或插入或删除)给定元素的能力。在不平衡树的情况下,需要花费与n成比例的时间,即O(n),否则为O(1)。

0

考虑使用Apache Commons Math,这里是API文档
有用的类是SummaryStatistics。它适用于double类型,并且可以实时计算最大值、最小值、平均值等等(当你往里面添加数值时)。数据值不会存储在内存中,因此该类可用于计算非常大的数据流的统计信息。


0

注意:如果你想从Map中找到最大值,请尝试使用maxEntry.get().getValue()而不是maxEntry.get().getKey()

1. 使用Stream

public <K, V extends Comparable<V>> V maxUsingStreamAndLambda(Map<K, V> map) {
    Optional<Entry<K, V>> maxEntry = map.entrySet()
        .stream()
        .max((Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
            .compareTo(e2.getValue())
        );

    return maxEntry.get().getKey();
}

2. 使用Lambda表达式与Collections.max()方法

public <K, V extends Comparable<V>> V maxUsingCollectionsMaxAndLambda(Map<K, V> map) {
    Entry<K, V> maxEntry = Collections.max(map.entrySet(), (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
        .compareTo(e2.getValue()));
    return maxEntry.getKey();
}

3. 使用方法引用的流

public <K, V extends Comparable<V>> V maxUsingStreamAndMethodReference(Map<K, V> map) {
    Optional<Entry<K, V>> maxEntry = map.entrySet()
        .stream()
        .max(Comparator.comparing(Map.Entry::getValue));
    return maxEntry.get()
        .getKey();
}

4. 使用 Collections.max()

public <K, V extends Comparable<V>> V maxUsingCollectionsMax(Map<K, V> map) {
    Entry<K, V> maxEntry = Collections.max(map.entrySet(), new Comparator<Entry<K, V>>() {
        public int compare(Entry<K, V> e1, Entry<K, V> e2) {
            return e1.getValue()
                .compareTo(e2.getValue());
        }
    });
    return maxEntry.getKey();
}

5. 使用简单迭代

public <K, V extends Comparable<V>> V maxUsingIteration(Map<K, V> map) {
    Map.Entry<K, V> maxEntry = null;
    for (Map.Entry<K, V> entry : map.entrySet()) {
        if (maxEntry == null || entry.getValue()
            .compareTo(maxEntry.getValue()) > 0) {
            maxEntry = entry;
        }
    }
    return maxEntry.getKey();
}

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