programing

새 목록을 만들지 않고 집합을 목록으로 변환

bestcode 2022. 9. 3. 13:20
반응형

새 목록을 만들지 않고 집합을 목록으로 변환

하여 I 코드를 하고 있습니다.Set a까지List:

Map<String, List<String>> mainMap = new HashMap<>();

for (int i=0; i < something.size(); i++) {
  Set<String> set = getSet(...); //returns different result each time
  List<String> listOfNames = new ArrayList<>(set);
  mainMap.put(differentKeyName, listOfNames);
}

루프가 반복될 때마다 새 목록을 만드는 것을 피하고 싶습니다.가능할까요?

List.addAll() 메서드를 사용할 수 있습니다.Collection을 인수로 받아들이며, Collection은 Collection입니다.

List<String> mainList = new ArrayList<String>();
mainList.addAll(set);

EDIT: 질문 편집에 응답합니다.
쉽게 알 수 있습니다.MapLists는 값으로서 k개의 다른 값을 가지려면 k개의 다른 목록을 작성해야 합니다.
따라서 이러한 목록을 작성하는 것을 피할 수 없습니다.목록을 작성해야 합니다.

할 수 있는
MapMap<String,Set> ★★★★★★★★★★★★★★★★★」Map<String,Collection>대신 세트를 넣어주세요.

생성자를 사용하여 변환:

List<?> list = new ArrayList<>(set);

【구아바 컬렉션】을 사용할 수 .newArrayList(Collection):

Lists.newArrayList([your_set])

이것은 amit의 이전 답변과 매우 유사하지만 선언(또는 설치)할 필요가 없습니다.list★★★★★★ 。

Java 8에서는 다음 1개의 라이너를 사용할 수 있습니다.

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);

되지 않았기 때문에 부터는 새로운 10을 할 수 .copyOf다음 중 하나:

List.copyOf(set);

Javadoc에서:

지정된 컬렉션의 요소를 포함하는 수정할 수 없는 목록을 반복 순서로 반환합니다.

이렇게 하면 후드 아래에 (정확하게 말하면) 새 ImmutableCollections$ListN목록이 생성됩니다.

  1. , " "Collection#toArray()로, 그 는 「」로 합니다.
  2. 이 오브젝트를 새 배열에 넣습니다.

다음과 같이 하겠습니다.

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);
}

한 줄 쓸 수 .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()])));
}  

을 제공하며 에서 목록을 얻을 수 .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가 보증하는 것은 아닙니다.여기에 기재된 바와 같이:

반환된 목록의 유형, 가변성, 직렬성 또는 스레드 안전성에 대한 보장은 없습니다. 반환된 목록에 대한 추가 제어가 필요한 경우 toCollection(공급업체)을 사용하십시오.

항상 확실하게 하려면 다음과 같이 인스턴스를 요구할 수 있습니다.

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>));

완전성을 위해...

정말 치료하고 싶다고 말해.Map「」로서 값을 합니다.List 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아SetList★★★★★★ 。

를 들어, 「1」을하는 라이브러리 함수를 경우가 있습니다.Set 지금 있어요.Map<String, List<String>> () 는 ('설계되어 있지만' 라이브러리'만) .Map<String, List<String>>어떤 이유에선지 알 수 있지만,List는 어떤 에도 동일하게 할 수 .Collection any ('어느쪽이든')Set어떤 이유로든 각 세트를 목록에 복사하는 속도/메모리 오버헤드를 피할 필요가 있습니다.

케이스에서는 동작 수 없는에 따라 .List s를 수 .List 세트 위로 보기.이는 본질적으로 안전하지 않다는 점에 유의하십시오(라이브러리 기능의 각 요건이 있기 때문에).List아마 자신도 모르는 사이에 변경될 가능성이 있습니다).따라서 다른 솔루션이 선호됩니다.하지만 이렇게 하는 거야

'수업'을 수 List 「」, 「」를 합니다.Set[ ](을한 후 내부 을 사용합니다.SetListAPI( 「 」 )

를 List로 수 .List일부 동작은 부분적으로만 흉내낼 수 있습니다. 말씀드리지만,이한 드랍인 대체가 .List일반적으로는 입니다. 이 관련 이 필요한 있는 , MUTATING은 MUTATING 입니다.List은 매우

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<String> set = getSet(...);
ListViewOfSet<String> listOfNames = new ListViewOfSet<>(set);
...

이것은 정상적으로 동작하고 있어, 세트로부터 리스트를 작성하는데 도움이 됩니다.

ArrayList < String > L1 = new ArrayList < String > ();
L1.addAll(ActualMap.keySet());
for (String x: L1) {
    System.out.println(x.toString());
}

Set로로 합니다.List주문 정보(예: 정렬)를 추가하지 않고 지도에 저장할 수 있습니다.

★★★★★★★★★★★★★★★★★★Set 없이 순서 .「 is되 、 [ ] 。List임의로 정렬된 데이터가 포함되어 있고 정렬된 데이터와 관련된 모든 방법이 모호하므로 사용하지 마십시오.

하면 됩니다.Collection 는 「접속」, 「접속」의 양쪽 모두를 .Set ★★★★★★★★★★★★★★★★★」List지도에 표시됩니다.이렇게 하면 데이터를 복사하는 대신 다형성을 사용하기 때문에 추가 메모리가 필요하지 않습니다.

Map<String, Collection<String>> mainMap = new HashMap<>();

for (int i=0; i < something.size(); i++) {
  Set<String> set = getSet(...); //returns different result each time
  mainMap.put(differentKeyName, 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

반응형