안에 - list map string string in java
Java Map의 각 항목을 효율적으로 반복하는 방법은 무엇입니까? (20)
람다 식 자바 8
Java 1.8 (Java 8)에서는 Iterable 인터페이스의 반복자와 비슷한 Aggregate 연산 ( 스트림 연산 )의 forEach 메소드를 사용하면 훨씬 쉽게 처리 할 수 있습니다.
아래 문장을 코드에 복사하고 HashMap 변수의 이름을 HashMap 변수로 바꿔 키 - 값 쌍을 출력하십시오.
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
/*
* Logic to put the Key,Value pair in your HashMap hm
*/
// Print the key value pair in one line.
hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v));
// Just copy and paste above line to your code.
다음은 람다 식을 사용하여 시도한 샘플 코드입니다. 이 물건들은 너무 멋지다. 꼭 해봐.
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
Random rand = new Random(47);
int i=0;
while(i<5){
i++;
int key = rand.nextInt(20);
int value = rand.nextInt(50);
System.out.println("Inserting key: "+key+" Value: "+value);
Integer imap =hm.put(key,value);
if( imap == null){
System.out.println("Inserted");
}
else{
System.out.println("Replaced with "+imap);
}
}
hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v));
Output:
Inserting key: 18 Value: 5
Inserted
Inserting key: 13 Value: 11
Inserted
Inserting key: 1 Value: 29
Inserted
Inserting key: 8 Value: 0
Inserted
Inserting key: 2 Value: 7
Inserted
key: 1 value:29
key: 18 value:5
key: 2 value:7
key: 8 value:0
key: 13 value:11
또한 하나는 Spliterator 를 사용할 수 있습니다.
Spliterator sit = hm.entrySet().spliterator();
최신 정보
Oracle Docs에 대한 문서 링크 포함. 람다 에 대한 자세한 내용은이 link 로 이동해야하며 집계 연산을 읽어야하며 Spliterator에 대해서는이 link 로 이동 link .
Java에서 Map
인터페이스를 구현하는 객체가 있고 그 안에 포함 된 모든 쌍을 반복하고 싶다면지도를 통과하는 가장 효율적인 방법은 무엇입니까?
요소의 순서는 인터페이스에 대한 특정 맵 구현에 따라 결정됩니까?
Java 8 사용 :
map.entrySet().forEach(entry -> System.out.println(entry.getValue()));
Java 8에서는 link 을 허용하는 forEach
메서드가 있습니다. stream API도 있습니다. 지도를 고려하십시오.
Map<String,String> sample = new HashMap<>();
sample.put("A","Apple");
sample.put("B", "Ball");
키 반복 :
sample.keySet().forEach((k) -> System.out.println(k));
오버 반복 값 :
sample.values().forEach((v) -> System.out.println(v));
엔트리 반복 (forEach 및 Streams 사용) :
sample.forEach((k,v) -> System.out.println(k + "=" + v));
sample.entrySet().stream().forEach((entry) -> {
Object currentKey = entry.getKey();
Object currentValue = entry.getValue();
System.out.println(currentKey + "=" + currentValue);
});
스트림의 이점은 우리가 원할 경우 쉽게 병렬화 될 수 있다는 것입니다. 위의 stream()
대신에 parallelStream()
을 사용하기 만하면됩니다.
Java 8에서는 새로운 lambdas 기능을 사용하여 빠르고 깨끗하게 처리 할 수 있습니다.
Map<String,String> map = new HashMap<>();
map.put("SomeKey", "SomeValue");
map.forEach( (k,v) -> [do something with key and value] );
// such as
map.forEach( (k,v) -> System.out.println("Key: " + k + ": Value: " + v));
k
및 v
의 유형은 컴파일러에 의해 추론되며 더 이상 Map.Entry
를 사용할 필요가 없습니다.
쉬워요!
반복자 및 제네릭 사용 예제 :
Iterator<Map.Entry<String, String>> entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
// ...
}
순서는 항상 특정 맵 구현에 따라 다릅니다. Java 8을 사용하면 다음 중 하나를 사용할 수 있습니다.
map.forEach((k,v) -> { System.out.println(k + ":" + v); });
또는:
map.entrySet().forEach((e) -> {
System.out.println(e.getKey() + " : " + e.getValue());
});
결과는 동일합니다 (동일한 순서). 동일한 순서를 얻으므로 entrySet은 맵에 의해 뒷받침됩니다. 두 번째 방법은 람다 (lambda)를 사용할 수 있기 때문에 편리합니다. 예를 들어 5보다 큰 Integer 객체 만 인쇄하려는 경우에 유용합니다.
map.entrySet()
.stream()
.filter(e-> e.getValue() > 5)
.forEach(System.out::println);
아래의 코드는 LinkedHashMap과 정상적인 HashMap을 통한 반복을 보여줍니다 (예). 순서에 차이가 있음을 알 수 있습니다.
public class HMIteration {
public static void main(String[] args) {
Map<Object, Object> linkedHashMap = new LinkedHashMap<>();
Map<Object, Object> hashMap = new HashMap<>();
for (int i=10; i>=0; i--) {
linkedHashMap.put(i, i);
hashMap.put(i, i);
}
System.out.println("LinkedHashMap (1): ");
linkedHashMap.forEach((k,v) -> { System.out.print(k + " (#="+k.hashCode() + "):" + v + ", "); });
System.out.println("\nLinkedHashMap (2): ");
linkedHashMap.entrySet().forEach((e) -> {
System.out.print(e.getKey() + " : " + e.getValue() + ", ");
});
System.out.println("\n\nHashMap (1): ");
hashMap.forEach((k,v) -> { System.out.print(k + " (#:"+k.hashCode() + "):" + v + ", "); });
System.out.println("\nHashMap (2): ");
hashMap.entrySet().forEach((e) -> {
System.out.print(e.getKey() + " : " + e.getValue() + ", ");
});
}
}
LinkedHashMap (1) :
10, # 9, # 9, # 8, # 8, # 7, # 7 : 7,6 (# 6) : 6, 5 1, 0 (# = 1) : 0, # 1, # 2, # 3,
LinkedHashMap (2) :
10 : 10, 9 : 9, 8 : 8, 7 : 7, 6 : 6, 5 : 5, 4 : 4, 3 : 3, 2 : 2, 1 : 1,
HashMap (1) :
1, 2 (# : 2) : 2, 3 (# : 3) : 3, 4 (# : 4) : 4, 5 (# : 5) 5, 6 (# 6) : 6, 7 (# 7) : 7,8 (# 8) : 8,9 (# 9) : 9,10 (# 10) : 10,
HashMap (2) :
1 : 1, 2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6, 7 : 7,8 : 8,9 : 9,10 :
예, 순서는 특정 Map 구현에 따라 다릅니다.
@ ScArcher2는보다 우아한 Java 1.5 구문을 사용합니다 . 1.4에서는 다음과 같이 할 것이다.
Iterator entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
Entry thisEntry = (Entry) entries.next();
Object key = thisEntry.getKey();
Object value = thisEntry.getValue();
// ...
}
이것은 두 부분으로 나뉜 질문입니다.
맵의 엔트리를 반복하는 방법 - @ ScArcher2가 완벽하게 answered 했습니다.
반복의 순서는 무엇입니까 - 당신이 Map
만을 사용하고 있다면 엄밀히 말하면 주문 보증 은 없습니다 . 따라서 어떤 구현에 의해 주어진 순서에 실제로 의존해서는 안됩니다. 그러나 SortedMap
인터페이스는 Map
확장하고 사용자가 찾고있는 것을 정확하게 제공합니다. 구현은 일관된 정렬 순서를 제공합니다.
NavigableMap
은 또 다른 유용한 확장입니다 .이 키는 SortedMap
이며 키 집합에서 정렬 된 위치로 항목을 찾는 추가 메서드가 있습니다. 그래서 잠재적으로 이것은 처음부터 반복의 필요성을 제거 할 수 있습니다 - higherEntry
, lowerEntry
, ceilingEntry
또는 floorEntry
메소드를 사용하여 특정 entry
을 찾을 수 있습니다. descendingMap
메서드 는 순회 순서 를 역전시키는 명시적인 방법을 제공합니다.
이를 수행하는 데는 여러 가지 방법이 있습니다. 다음은 몇 가지 간단한 단계입니다.
다음과 같이 하나의지도가 있다고 가정 해보십시오.
Map<String, Integer> m = new HashMap<String, Integer>();
그런 다음 아래와 같이지도 요소를 반복 할 수 있습니다.
// ********** Using an iterator ****************
Iterator<Entry<String, Integer>> me = m.entrySet().iterator();
while(me.hasNext()){
Entry<String, Integer> pair = me.next();
System.out.println(pair.getKey() + ":" + pair.getValue());
}
// *********** Using foreach ************************
for(Entry<String, Integer> me : m.entrySet()){
System.out.println(me.getKey() + " : " + me.getValue());
}
// *********** Using keySet *****************************
for(String s : m.keySet()){
System.out.println(s + " : " + m.get(s));
}
// *********** Using keySet and iterator *****************
Iterator<String> me = m.keySet().iterator();
while(me.hasNext()){
String key = me.next();
System.out.println(key + " : " + m.get(key));
}
이를 수행하는 올바른 방법은 허용 된 답변을 가장 효율적으로 사용하는 것입니다. 다음 코드는 조금 더 깨끗해 보입니다.
for (String key: map.keySet()) {
System.out.println(key + "/" + map.get(key));
}
자바 1.4에서 이것을 사용해보십시오 :
for( Iterator entries = myMap.entrySet().iterator(); entries.hasNext();){
Entry entry = (Entry) entries.next();
System.out.println(entry.getKey() + "/" + entry.getValue());
//...
}
제네릭을 사용하여 할 수 있습니다.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
지도를 반복하는 일반적인 코드는 다음과 같습니다.
Map<String,Thing> map = ...;
for (Map.Entry<String,Thing> entry : map.entrySet()) {
String key = entry.getKey();
Thing thing = entry.getValue();
...
}
HashMap
는 표준지도 구현이며 보장하지 않습니다 (또는 변형 작업이 수행되지 않으면 순서를 변경하면 안 됨). SortedMap
는 키의 자연 순서 SortedMap
Comparator
제공된 경우)를 기반으로 항목을 리턴합니다. LinkedHashMap
는, 작성 방법에 응해, 삽입 순서 또는 액세스 순서로 엔트리를 돌려줍니다. EnumMap
은 자연 순서로 항목을 반환합니다.
(Update : 더 이상 사실이 아닙니다. ) 참고로, IdentityHashMap
entrySet
iterator는 현재 entrySet
모든 항목에 대해 동일한 Map.Entry
인스턴스를 반환하는 고유 한 구현을 가지고 있습니다! 그러나 이터레이터가 새로운 것이 될 때마다 Map.Entry
가 업데이트됩니다.
지도에서 keys
및 / 또는 values
및 / 또는 both (eg, entrySet)
대한 반복 both (eg, entrySet)
은 관심있는 in_에 따라 달라질 수 있습니다. 좋아요 :
1.)지도의 keys -> keySet()
을 반복합니다 :
Map<String, Object> map = ...;
for (String key : map.keySet()) {
//your Business logic...
}
2.)지도의 values -> values()
를 반복합니다.
for (Object value : map.values()) {
//your Business logic...
}
3.) 맵의 both -> entrySet()
을 both -> entrySet()
반복합니다.
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
//your Business logic...
}
게다가, HashMap을 통해 반복하는 3 가지 다른 방법이 있습니다. 그들은 다음과 같습니다 _
//1.
for (Map.Entry entry : hm.entrySet()) {
System.out.print("key,val: ");
System.out.println(entry.getKey() + "," + entry.getValue());
}
//2.
Iterator iter = hm.keySet().iterator();
while(iter.hasNext()) {
Integer key = (Integer)iter.next();
String val = (String)hm.get(key);
System.out.println("key,val: " + key + "," + val);
}
//3.
Iterator it = hm.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
Integer key = (Integer)entry.getKey();
String val = (String)entry.getValue();
System.out.println("key,val: " + key + "," + val);
}
Eclipse Collections (이전의 GS Collections )에서는 MapIterable 인터페이스에서 forEachKeyValue 메소드를 사용합니다.이 메소드는 MutableMap 및 ImmutableMap 인터페이스와 해당 구현에 의해 상속됩니다.
final MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue(new Procedure2<Integer, String>()
{
public void value(Integer key, String value)
{
result.add(key + value);
}
});
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);
Java 8 람다 구문을 사용하면 다음과 같이 코드를 작성할 수 있습니다.
MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue((key, value) -> result.add(key + value));
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);
참고 : 저는 Eclipse Collections에 대한 커미터입니다.
Java 8 :
람다 식을 사용할 수 있습니다.
myMap.entrySet().stream().forEach((entry) -> {
Object currentKey = entry.getKey();
Object currentValue = entry.getValue();
});
자세한 내용은 다음을 참조 this .
//Functional Oprations
Map<String, String> mapString = new HashMap<>();
mapString.entrySet().stream().map((entry) -> {
String mapKey = entry.getKey();
return entry;
}).forEach((entry) -> {
String mapValue = entry.getValue();
});
//Intrator
Map<String, String> mapString = new HashMap<>();
for (Iterator<Map.Entry<String, String>> it = mapString.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, String> entry = it.next();
String mapKey = entry.getKey();
String mapValue = entry.getValue();
}
//Simple for loop
Map<String, String> mapString = new HashMap<>();
for (Map.Entry<String, String> entry : mapString.entrySet()) {
String mapKey = entry.getKey();
String mapValue = entry.getValue();
}
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry element = (Map.Entry)it.next();
LOGGER.debug("Key: " + element.getKey());
LOGGER.debug("value: " + element.getValue());
}
Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet())
{
System.out.println(entry.getKey() + "/" + entry.getValue());
}
package com.test;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("ram", "ayodhya");
map.put("krishan", "mathura");
map.put("shiv", "kailash");
System.out.println("********* Keys *********");
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
}
System.out.println("********* Values *********");
Collection<String> values = map.values();
for (String value : values) {
System.out.println(value);
}
System.out.println("***** Keys and Values (Using for each loop) *****");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + "\t Value: "
+ entry.getValue());
}
System.out.println("***** Keys and Values (Using while loop) *****");
Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry<String, String>) entries
.next();
System.out.println("Key: " + entry.getKey() + "\t Value: "
+ entry.getValue());
}
System.out
.println("** Keys and Values (Using java 8 using lambdas )***");
map.forEach((k, v) -> System.out
.println("Key: " + k + "\t value: " + v));
}
}