在HashSet / HashMap java中查找最大数字

时间:2013-02-12 11:04:49

标签: java hashmap hashset

我想在HashSet和HashMap中找到最大的数字。假设我的HashSet中有数字[22,6763,32,42,33],我想在我当前的HashSet中找到最大的数字。我会这样做吗?和HashMap一样。我希望你能帮助我。谢谢。

8 个答案:

答案 0 :(得分:62)

您可以使用Collections.max(Collection)查找任何集合中的最大元素。 同样,对于HashMap,您可以在keySet()values()上使用相同的方法,具体取决于您是想要最大键还是最大值。

此外,如果您希望如此,您可以使用TreeSetTreeMap来代替按顺序存储元素。

答案 1 :(得分:9)

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

答案 2 :(得分:6)

如果您被迫使用HashSet / HashMap,则必须扫描整个HashSet / HashMap才能找到最大值。像Collections.max()这样的库函数就是这样的。

如果您希望O(1)检索最大值,并且您可以更改正在使用的集合类型,请使用有序集/映射(例如TreeSet / TreeMap)。

答案 3 :(得分: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;
    }
}

答案 4 :(得分:0)

对于TreeMap,如果您知道随机插入键/值,则树将或多或少地平衡。树变得不平衡,如果以已排序的顺序插入数据,则快速查找(或插入或删除)给定元素的能力将丢失。在不平衡树的情况下,它需要时间与n,O(n)其他O(1)成比例。

答案 5 :(得分:0)

考虑使用Apache Commons Math。这是API docs 感兴趣的课程是SummaryStatistics。它适用于double并且可以动态计算最大值,最小值,平均值等(当您向其添加值时)。数据值不存储在内存中,因此该类可用于计算非常大的数据流的统计信息。

答案 6 :(得分: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;
}

答案 7 :(得分:0)

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

1。使用流

#define srcpath SOURCEPATH
#define ApplicationVersion GetFileVersion(#srcpath)//error here!!!!!!

[Setup]
AppVersion={#ApplicationVersion}

[Files]
Source: "MyDllTesting.dll"; Flags: dontcopy
Source: "{srcpath}MyApplication1.exe"; DestDir: "{app}\MyApplication1"

2。在Lambda表达式中使用Collections.max()

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

3。结合使用流和方法参考

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

4。使用Collections.max()

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

5。使用简单迭代

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