키와 값 모두에 대한 문자열이있는 맵이 있습니다.
데이터는 다음과 같습니다.
“question1”, “1”
“question9”, “1”
“question2”, “4”
“question5”, “2”
키를 기준으로 맵을 정렬하고 싶습니다. 결국에는 question1, question2, question3
…. 등이 있습니다.
결국, 나는이 맵에서 두 개의 문자열을 얻으려고합니다.
- 첫 번째 문자열 : 질문 (1.10 순서)
- 두 번째 문자열 : 답변 (질문과 같은 순서로)
지금 나는 다음을 가지고 있습니다.
Iterator it = paramMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();
questionAnswers += pairs.getKey() + ",";
}
이것은 나에게 문자열로 질문을 받지만 순서가 맞지 않습니다.
답변
짧은 답변
를 사용하십시오 TreeMap
. 이것이 바로 그 목적입니다.
이지도가 전달되어 유형을 결정할 수없는 경우 다음을 수행 할 수 있습니다.
SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}
이것은 자연스럽게 키 순서대로 맵을 반복합니다.
더 긴 답변
기술적으로 구현하는 모든 것을 사용할 수 SortedMap
있지만 드문 경우를 제외하고 TreeMap
는 Map
구현 을 사용하는 것이 일반적으로 그렇듯이이 정도에 해당합니다 HashMap
.
Comparable를 구현하지 않거나 다음 자연의 질서를 사용하지 않으려는 키가 복잡한 유형의 경우를 들어 TreeMap
그리고 TreeSet
당신이 전달하자 추가 생성자를 가지고 Comparator
:
// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
...
}
SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());
를 사용할 때 기억 TreeMap
나 TreeSet
는 다른 성능 특성있을 것이라는 점을 HashMap
또는 HashSet
. 요소를 찾거나 삽입하는 대략적인 연산은 O (1) 에서 O (Log (N))로 이동 합니다.
A의 HashMap
1 만 1000 개 항목에서 이동하는 것은 정말 요소를 조회하는 시간에 영향을 미치지 않지만, 대한 TreeMap
조회 시간은 약 3 배 더 느리게 (로그인 가정 할 것이다 2 ). 1000에서 100,000으로 이동하면 모든 요소 조회에 대해 약 6 배 느려집니다.
답변
TreeMap이 좋지 않다고 가정하고 제네릭을 사용할 수 없다고 가정합니다.
List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.
답변
를 사용하여 TreeMap
지도를 정렬 할 수 있습니다.
Map<String, String> map = new HashMap<>();
Map<String, String> treeMap = new TreeMap<>(map);
for (String str : treeMap.keySet()) {
System.out.println(str);
}
답변
TreeMap을 사용하십시오 !
답변
이미 맵이 있고 키로 정렬하려면 다음을 사용하십시오.
Map<String, String> treeMap = new TreeMap<String, String>(yourMap);
완전한 작업 예 :
import java.util.HashMap;
import java.util.Set;
import java.util.Map;
import java.util.TreeMap;
import java.util.Iterator;
class SortOnKey {
public static void main(String[] args) {
HashMap<String,String> hm = new HashMap<String,String>();
hm.put("3","three");
hm.put("1","one");
hm.put("4","four");
hm.put("2","two");
printMap(hm);
Map<String, String> treeMap = new TreeMap<String, String>(hm);
printMap(treeMap);
}//main
public static void printMap(Map<String,String> map) {
Set s = map.entrySet();
Iterator it = s.iterator();
while ( it.hasNext() ) {
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println(key + " => " + value);
}//while
System.out.println("========================");
}//printMap
}//class
답변
그냥 TreeMap을 사용하십시오
new TreeMap<String, String>(unsortMap);
TreeMap은 ‘키’의 자연 순서에 따라 정렬됩니다.
답변
당신이 사용할 수 없습니다 제공 TreeMap
에 자바 (8) 우리는 사용 할 수 toMap () 메서드에서 Collectors
어떤 매개 변수 다음 걸립니다를 :
- keymapper : 키를 생성하는 매핑 기능
- valuemapper : 값을 생성하는 매핑 함수
- mergeFunction : 동일한 키와 연관된 값 사이의 충돌을 해결하는 데 사용되는 병합 함수
- mapSupplier : 결과가 삽입 될 비어있는 새 맵을 리턴하는 함수입니다.
자바 8 예제
Map<String,String> sample = new HashMap<>(); // push some values to map
Map<String, String> newMapSortedByKey = sample.entrySet().stream()
.sorted(Map.Entry.<String,String>comparingByKey().reversed())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
Map<String, String> newMapSortedByValue = sample.entrySet().stream()
.sorted(Map.Entry.<String,String>comparingByValue().reversed())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1,e2) -> e1, LinkedHashMap::new));
커스텀 비교기를 사용하고 다음과 같이 키를 기준으로 정렬하도록 예제를 수정할 수 있습니다.
Map<String, String> newMapSortedByKey = sample.entrySet().stream()
.sorted((e1,e2) -> e1.getKey().compareTo(e2.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1,e2) -> e1, LinkedHashMap::new));