我想在HashSet和HashMap中找到最大的数字。假设我的HashSet中有数字[22,6763,32,42,33],我想在我当前的HashSet中找到最大的数字。我会这样做吗?和HashMap一样。我希望你能帮助我。谢谢。
答案 0 :(得分:62)
您可以使用Collections.max(Collection)
查找任何集合中的最大元素。
同样,对于HashMap
,您可以在keySet()
或values()
上使用相同的方法,具体取决于您是想要最大键还是最大值。
答案 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();
}