새 목록을 만들지 않고 세트를 목록으로 변환
나는 변환이 코드를 사용하고 Set
A를 List
:
Map<String, List> mainMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
Set set = getSet(...); //returns different result each time
List listOfNames = new ArrayList(set);
mainMap.put(differentKeyName,listOfNames);
}
루프의 각 반복에서 새 목록을 작성하지 않으려 고합니다. 가능합니까?
List.addAll () 메소드를 사용할 수 있습니다 . Collection을 인수로 받아들이고 세트는 Collection입니다.
List<String> mainList = new ArrayList<String>();
mainList.addAll(set);
편집 : 질문의 편집에 응답합니다.
그것은 당신이 갖고 싶어 것을 쉽게 알 수있다 Map
와 List
K 다른 값을 가질하기 위해, 값으로들, 당신은 K 다른 목록을 작성해야합니다.
따라서 :이 목록을 전혀 작성하지 않으려면 목록을 작성해야합니다.
가능한 해결책은 :
당신을 선언 Map
A와 Map<String,Set>
나 Map<String,Collection>
대신에, 그리고 당신의 세트를 삽입합니다.
생성자를 사용하여 변환하십시오.
List<?> list = new ArrayList<?>(set);
또한 Guava Collect 라이브러리에서 다음을 사용할 수 있습니다 newArrayList(Collection)
.
Lists.newArrayList([your_set])
이것은 객체 를 선언 (또는 포함) 할 필요가 없다는 점을 제외하고 는 amit 의 이전 답변과 매우 유사 list
합니다.
Java 8에서 다음과 같은 하나의 라이너를 사용할 수 있습니다.
List<String> list = set.stream().collect(Collectors.toList());
다음은 작은 예입니다.
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("A");
set.add("B");
set.add("C");
List<String> list = set.stream().collect(Collectors.toList());
}
가장 간단한 해결책
내 세트를 List로 변환하고 반환하는 매우 빠른 방법을 원했기 때문에 한 줄로
return new ArrayList<Long>(mySetVariable);
이 한 줄 변경을 사용할 수 있습니다. Arrays.asList(set.toArray(new Object[set.size()]))
Map<String, List> mainMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
Set set = getSet(...);
mainMap.put(differentKeyName, Arrays.asList(set.toArray(new Object[set.size()])));
}
나는 할것이다 :
Map<String, Collection> mainMap = new HashMap<String, Collection>();
for(int i=0; i<something.size(); i++){
Set set = getSet(...); //return different result each time
mainMap.put(differentKeyName,set);
}
Java 8은 스트림 사용 옵션을 제공하며 다음과 같은 목록을 얻을 수 있습니다 Set<String> setString
.
List<String> stringList = setString.stream().collect(Collectors.toList());
현재 내부 구현은 다음과 같은 인스턴스를 제공하지만 ArrayList
:
public static <T>
Collector<T, ?, List<T>> toList() {
return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
그러나 JDK는이를 보증하지 않습니다. 여기에 언급 한 바와 같이 :
반환 된 List의 유형, 변경 가능성, 직렬화 가능성 또는 스레드 안전성에 대한 보장은 없습니다. 리턴 된 List에 대한 추가 제어가 필요한 경우 toCollection (Supplier)을 사용하십시오.
항상 확실하게하려면 다음과 같이 인스턴스를 요청할 수 있습니다.
List<String> stringArrayList = setString.stream()
.collect(Collectors.toCollection(ArrayList::new));
간단한 static
방법을 만듭니다 .
public static <U> List<U> convertSetToList(Set<U> set)
{
return new ArrayList<U>(set);
}
... 또는 목록 유형을 설정하려면 다음을 사용할 수 있습니다.
public static <U, L extends List<U>> List<U> convertSetToList(Set<U> set, Class<L> clazz) throws InstantiationException, IllegalAccessException
{
L list = clazz.newInstance();
list.addAll(set);
return list;
}
최근에 이것을 찾았습니다 :
ArrayList<T> yourList = Collections.list(Collections.enumeration(yourSet<T>));
이 작업이 훌륭하고 세트에서 목록을 만드는 데 유용하다는 것을 알았습니다.
ArrayList < String > L1 = new ArrayList < String > ();
L1.addAll(ActualMap.keySet());
for (String x: L1) {
System.out.println(x.toString());
}
완전성을 위해 ...
실제로 맵 값을 목록으로 취급하고 싶지만 매번 세트를 목록으로 복사하지 않으려 고 한다고 가정 하십시오.
예를 들어, Set을 생성하는 하나의 라이브러리 함수를 호출하고 있지만 Map <String, List> 결과를 Map <String, List> 만 사용하는 (잘못 설계되었지만 손에 넣지 않은) 라이브러리 함수로 전달하고 있습니다. , 목록에서 수행하는 작업이 모든 컬렉션 (및 모든 집합)에 동일하게 적용된다는 것을 알고 있습니다. 그리고 어떤 이유로 각 세트를 목록으로 복사하는 속도 / 메모리 오버 헤드를 피해야합니다.
이 슈퍼 틈새의 경우 라이브러리 함수가 목록에서 필요로하는 (알 수없는) 동작에 따라 각 세트에 대해 목록 보기 를 작성할 수 있습니다 . 각 List의 라이브러리 함수 요구 사항은 사용자 모르게 변경 될 수 있기 때문에 이것은 본질적으로 안전하지 않으므로 다른 솔루션을 선호해야합니다. 그러나 여기 당신이 어떻게 할 것입니다.
List 인터페이스를 구현하고 생성자에서 Set을 가져와 해당 Set을 필드에 할당 한 다음 해당 내부 Set을 사용하여 List API를 구현하는 클래스를 만들 수 있습니다 (가능한 한, 원하는 범위까지).
일부 List 동작은 요소를 List로 저장하지 않고 단순히 모방 할 수 없으며 일부 동작은 부분적으로 만 모방 할 수 있습니다. 이 클래스는 일반적으로 List를 안전하게 대체하지 않습니다. 특히 유스 케이스에 색인 관련 조작 또는 목록 MUTATING 목록이 필요하다는 것을 알고 있으면이 접근 방식은 매우 빠르게 진행됩니다.
public class ListViewOfSet<U> implements List<U> {
private final Set<U> wrappedSet;
public ListViewOfSet(Set<U> setToWrap) { this.wrappedSet = setToWrap; }
@Override public int size() { return this.wrappedSet.size(); }
@Override public boolean isEmpty() { return this.wrappedSet.isEmpty(); }
@Override public boolean contains(Object o) { return this.wrappedSet.contains(o); }
@Override public java.util.Iterator<U> iterator() { return this.wrappedSet.iterator(); }
@Override public Object[] toArray() { return this.wrappedSet.toArray(); }
@Override public <T> T[] toArray(T[] ts) { return this.wrappedSet.toArray(ts); }
@Override public boolean add(U e) { return this.wrappedSet.add(e); }
@Override public boolean remove(Object o) { return this.wrappedSet.remove(o); }
@Override public boolean containsAll(Collection<?> clctn) { return this.wrappedSet.containsAll(clctn); }
@Override public boolean addAll(Collection<? extends U> clctn) { return this.wrappedSet.addAll(clctn); }
@Override public boolean addAll(int i, Collection<? extends U> clctn) { throw new UnsupportedOperationException(); }
@Override public boolean removeAll(Collection<?> clctn) { return this.wrappedSet.removeAll(clctn); }
@Override public boolean retainAll(Collection<?> clctn) { return this.wrappedSet.retainAll(clctn); }
@Override public void clear() { this.wrappedSet.clear(); }
@Override public U get(int i) { throw new UnsupportedOperationException(); }
@Override public U set(int i, U e) { throw new UnsupportedOperationException(); }
@Override public void add(int i, U e) { throw new UnsupportedOperationException(); }
@Override public U remove(int i) { throw new UnsupportedOperationException(); }
@Override public int indexOf(Object o) { throw new UnsupportedOperationException(); }
@Override public int lastIndexOf(Object o) { throw new UnsupportedOperationException(); }
@Override public ListIterator<U> listIterator() { throw new UnsupportedOperationException(); }
@Override public ListIterator<U> listIterator(int i) { throw new UnsupportedOperationException(); }
@Override public List<U> subList(int i, int i1) { throw new UnsupportedOperationException(); }
}
...
Set set = getSet(...);
ListViewOfSet listOfNames = new ListViewOfSet(set);
...
Map<String, List> mainMap = new HashMap<String, List>();
for(int i=0; i<something.size(); i++){
Set set = getSet(...); //return different result each time
mainMap.put(differentKeyName, new ArrayList(set));
}
참고 URL : https://stackoverflow.com/questions/8892360/convert-set-to-list-without-creating-new-list
'development' 카테고리의 다른 글
handlebars.js {{#if}}의 논리 연산자 조건부 (0) | 2020.02.15 |
---|---|
속성 값으로 사용자 정의 객체 배열을 정렬하는 방법 (0) | 2020.02.15 |
node.js의 콘솔 글꼴 색상을 변경하는 방법? (0) | 2020.02.15 |
IntelliJ IDEA는 플러그인을 통해 WebStorm 및 PHPStorm의 모든 기능을 캡슐화 할 수 있습니까? (0) | 2020.02.15 |
C ++에서 배열을 어떻게 사용합니까? (0) | 2020.02.15 |