如何按排序顺序获取 TreeMap(或其他 Map,如有必要)条目?
How do I get the TreeMap (or other Map if necessary) entries in sorted order?
我需要一个可以让我按键排序元素的集合。键是整数,但它们不是连续的。这是我所拥有的示例:
<3, Alessandro>
<12, Mario>
<1, Marco>
我需要按以下顺序打印这些元素:
Marco
Alessandro
Mario
我尝试使用 TreeMap
,但我不能像这样进行循环:
for(int i = 0; i < treeMap.size(); i++){
System.out.println(treeMap.get(i));
}
因为密钥不是顺序的,调用 treeMap.get()
时会出错,因为我不知道密钥整数。
get
通过 key 获取,而不是索引位置。遍历 entrySet
或 keySet
.
设置:
TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
treeMap.put(3, "Alessandro");
treeMap.put(12, "Mario");
treeMap.put(1, "Marco");
使用 entrySet
的示例,在这种情况下,每次迭代都会得到一个 Map.Entry<Integer, String>
:
for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
System.out.println(entry.getValue());
}
或者,如果您更喜欢 keySet
,它会为您提供密钥 (Integer
s):
for (Integer key : treeMap.keySet()) {
System.out.println(treeMap.get(key));
}
不管怎样,上面的结果是:
Marco
Alessandro
Mario
例如,按键的自然顺序排序。
如果您确实需要使用 set 而不是 Map,您可以使用 TreeSet 并将 set 中使用的类型用作包装键和值并按键进行比较的对象。示例如下:
package com.Whosebug;
public class KeyValue<K extends Number, V> implements Comparable<KeyValue<K, V>> {
private final K key;
private final V value;
public KeyValue(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
@Override
public int compareTo(KeyValue<K, V> o) {
long keyValue = key.longValue();
long argKeyValue = o.key.longValue();
return (keyValue == argKeyValue) ? 0 : (keyValue < argKeyValue) ? -1 : 1;
}
@Override
public String toString() {
return key.toString() + ": " + value.toString();
}
}
和示例用法:
package com.Whosebug;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
TreeSet<KeyValue<Integer, String>> keyValues = new TreeSet<KeyValue<Integer, String>>();
KeyValue<Integer, String> keyValue1 = new KeyValue<Integer, String>(2, "asd");
KeyValue<Integer, String> keyValue2 = new KeyValue<Integer, String>(102, "sfsaf");
KeyValue<Integer, String> keyValue3 = new KeyValue<Integer, String>(12, "dgs");
KeyValue<Integer, String> keyValue4 = new KeyValue<Integer, String>(222, "dsgds");
KeyValue<Integer, String> keyValue5 = new KeyValue<Integer, String>(22, "aa");
KeyValue<Integer, String> keyValue6 = new KeyValue<Integer, String>(1, "sfasaf");
KeyValue<Integer, String> keyValue7 = new KeyValue<Integer, String>(3, "sfs");
KeyValue<Integer, String> keyValue8 = new KeyValue<Integer, String>(4, "www");
keyValues.add(keyValue1);
keyValues.add(keyValue2);
keyValues.add(keyValue3);
keyValues.add(keyValue4);
keyValues.add(keyValue5);
keyValues.add(keyValue6);
keyValues.add(keyValue7);
keyValues.add(keyValue8);
for (KeyValue<Integer, String> keyValue : keyValues) {
System.out.println(keyValue);
}
}
}
我需要一个可以让我按键排序元素的集合。键是整数,但它们不是连续的。这是我所拥有的示例:
<3, Alessandro>
<12, Mario>
<1, Marco>
我需要按以下顺序打印这些元素:
Marco
Alessandro
Mario
我尝试使用 TreeMap
,但我不能像这样进行循环:
for(int i = 0; i < treeMap.size(); i++){
System.out.println(treeMap.get(i));
}
因为密钥不是顺序的,调用 treeMap.get()
时会出错,因为我不知道密钥整数。
get
通过 key 获取,而不是索引位置。遍历 entrySet
或 keySet
.
设置:
TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
treeMap.put(3, "Alessandro");
treeMap.put(12, "Mario");
treeMap.put(1, "Marco");
使用 entrySet
的示例,在这种情况下,每次迭代都会得到一个 Map.Entry<Integer, String>
:
for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
System.out.println(entry.getValue());
}
或者,如果您更喜欢 keySet
,它会为您提供密钥 (Integer
s):
for (Integer key : treeMap.keySet()) {
System.out.println(treeMap.get(key));
}
不管怎样,上面的结果是:
Marco Alessandro Mario
例如,按键的自然顺序排序。
如果您确实需要使用 set 而不是 Map,您可以使用 TreeSet 并将 set 中使用的类型用作包装键和值并按键进行比较的对象。示例如下:
package com.Whosebug;
public class KeyValue<K extends Number, V> implements Comparable<KeyValue<K, V>> {
private final K key;
private final V value;
public KeyValue(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
@Override
public int compareTo(KeyValue<K, V> o) {
long keyValue = key.longValue();
long argKeyValue = o.key.longValue();
return (keyValue == argKeyValue) ? 0 : (keyValue < argKeyValue) ? -1 : 1;
}
@Override
public String toString() {
return key.toString() + ": " + value.toString();
}
}
和示例用法:
package com.Whosebug;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
TreeSet<KeyValue<Integer, String>> keyValues = new TreeSet<KeyValue<Integer, String>>();
KeyValue<Integer, String> keyValue1 = new KeyValue<Integer, String>(2, "asd");
KeyValue<Integer, String> keyValue2 = new KeyValue<Integer, String>(102, "sfsaf");
KeyValue<Integer, String> keyValue3 = new KeyValue<Integer, String>(12, "dgs");
KeyValue<Integer, String> keyValue4 = new KeyValue<Integer, String>(222, "dsgds");
KeyValue<Integer, String> keyValue5 = new KeyValue<Integer, String>(22, "aa");
KeyValue<Integer, String> keyValue6 = new KeyValue<Integer, String>(1, "sfasaf");
KeyValue<Integer, String> keyValue7 = new KeyValue<Integer, String>(3, "sfs");
KeyValue<Integer, String> keyValue8 = new KeyValue<Integer, String>(4, "www");
keyValues.add(keyValue1);
keyValues.add(keyValue2);
keyValues.add(keyValue3);
keyValues.add(keyValue4);
keyValues.add(keyValue5);
keyValues.add(keyValue6);
keyValues.add(keyValue7);
keyValues.add(keyValue8);
for (KeyValue<Integer, String> keyValue : keyValues) {
System.out.println(keyValue);
}
}
}