키와 값 모두에 대한 문자열이있는 맵이 있습니다.
데이터는 다음과 같습니다.
“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의 HashMap1 만 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));
