sourcecode

컬렉션을 목록으로 변환하는 방법

copyscript 2022. 7. 17. 16:37
반응형

컬렉션을 목록으로 변환하는 방법

사용하고 있다TreeBidiMapApache Collections 라이브러리에서 가져옵니다.나는 이것을 다음의 값에 따라 분류하고 싶다.doubles.

내 방법은 다음 중 하나를 검색하는 것입니다.Collection값을 지정합니다.

Collection coll = themap.values();

자연스럽게 잘 작동하죠.

주요 질문:변환/캐스팅 방법을 알고 싶습니다(어느 것이 맞는지 잘 모르겠습니다).collList정리할 수 있게?

그리고 나서 나는 분류된 것들을 반복할 생각이다.List오브젝트: 이 오브젝트는 순서대로 배치되어 있으며,TreeBidiMap(themap)의 사용themap.getKey(iterator.next())반복자가 목록 위에 있는 경우doubles.

List list = new ArrayList(coll);
Collections.sort(list);

Erel Segal Halevi가 아래에 말한 것처럼 coll이 이미 목록인 경우 1단계를 건너뛸 수 있습니다.그러나 그것은 TreeBidiMap의 내장에 달려있다.

List list;
if (coll instanceof List)
  list = (List)coll;
else
  list = new ArrayList(coll);

컬렉션을 수신하는 ArrayList 컨스트럭터를 호출하면 다음과 같은 작업이 가능합니다.

List theList = new ArrayList(coll);

폴 톰블린의 답변은 coll이 이미 목록인 경우 새로운 목록을 만들고 모든 요소를 복사하기 때문에 낭비일 수 있다고 생각합니다.coll에 많은 요소가 포함되어 있는 경우 시간이 오래 걸릴 수 있습니다.

제안사항은 다음과 같습니다.

List list;
if (coll instanceof List)
  list = (List)coll;
else
  list = new ArrayList(coll);
Collections.sort(list);

다음과 같이 쓸 수 있다고 생각합니다.

coll.stream().collect(Collectors.toList())

Java 10 도입List#copyOf주문을 보존하면서 수정할 수 없는 목록을 반환합니다.

List<Integer> list = List.copyOf(coll);
Collections.sort( new ArrayList( coll ) );

@쿠니가미:Guava's에 대해 잘못 알고 계신 것 같습니다.newArrayList방법.Itable이 List 타입인지 아닌지는 확인하지 않고 지정된 List를 있는 그대로 반환합니다.항상 새 목록을 만듭니다.

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
  checkNotNull(elements); // for GWT
  // Let ArrayList's sizing logic work, if possible
  return (elements instanceof Collection)
      ? new ArrayList<E>(Collections2.cast(elements))
      : newArrayList(elements.iterator());
}

요청하신 작업은 비용이 많이 드는 작업입니다. 자주(예를 들어 주기)를 수행할 필요가 없도록 하십시오.

정렬 상태를 유지해야 하고 자주 업데이트하는 경우 사용자 정의 컬렉션을 생성할 수 있습니다.예를 들어, 내가 생각해낸 건 네 거랑TreeBidiMap그리고.TreeMultiset보닛 밑에필요한 것만 구현하여 데이터 무결성에 관심을 기울입니다.

class MyCustomCollection implements Map<K, V> {
    TreeBidiMap<K, V> map;
    TreeMultiset<V> multiset;
    public V put(K key, V value) {
        removeValue(map.put(key, value));
        multiset.add(value);
    }
    public boolean remove(K key) {
        removeValue(map.remove(key));
    }
    /** removes value that was removed/replaced in map */
    private removeValue(V value) {
        if (value != null) {
            multiset.remove(value);
        }
    }
    public Set<K> keySet() {
        return Collections.unmodifiableSet(map.keySet());
    }
    public Collection<V> values() {
        return Collections.unmodifiableCollection(multiset);
    }
    // many more methods to be implemented, e.g. count, isEmpty etc.
    // but these are fairly simple
}

이 방법으로, 당신은 분류된 Multiset에서 반환되었다values()다만, 리스트가 필요한 경우(예를 들어 어레이와 같은 것이 필요)get(index)더 복잡한 방법이 필요합니다.

간결하게 하기 위해 수정할 수 없는 컬렉션만 반송합니다.@Lino가 언급한 내용은 정확하며, 이 명령어를 수정하는 것은keySet또는values일관성이 없는 수집이 될 수 있습니다.어떻게 하면 일관되게 만들 수 있을지 모르겠어요values변이 가능하지만keySet지원할 수 있다remove를 사용하는 경우remove로부터의 메서드MyCustomCollection위의 클래스입니다.

스트림 사용:

someCollection.stream().collect(Collectors.toList())

Java 8 이후...

Streams 및 Collectors.toCollection()사용하여 컬렉션을 임의의 컬렉션(리스트, 세트, 큐)으로 변환할 수 있습니다.

다음 맵의 예를 보겠습니다.

Map<Integer, Double> map = Map.of(
    1, 1015.45,
    2, 8956.31,
    3, 1234.86,
    4, 2348.26,
    5, 7351.03
);

어레이 리스트로

List<Double> arrayList = map.values()
                            .stream()
                            .collect(
                                Collectors.toCollection(ArrayList::new)
                            );

출력: [7351.03, 2348.26, 1234.86, 8956.31, 1015.45]

정렬된 배열 목록(오름차순)으로 이동합니다.

List<Double> arrayListSortedAsc = map.values()
                                        .stream()
                                        .sorted()
                                        .collect(
                                            Collectors.toCollection(ArrayList::new)
                                        );

출력: [1015.45, 1234.86, 2348.26, 7351.03, 8956.31]

정렬된 배열 목록으로 이동(내림차순)

List<Double> arrayListSortedDesc = map.values()
                                        .stream()
                                        .sorted(
                                            (a, b) -> b.compareTo(a)
                                        )
                                        .collect(
                                            Collectors.toCollection(ArrayList::new)
                                        );

출력: [8956.31, 7351.03, 2348.26, 1234.86, 1015.45]

Linked List로

List<Double> linkedList = map.values()
                                .stream()
                                .collect(
                                    Collectors.toCollection(LinkedList::new)
                                );

출력: [7351.03, 2348.26, 1234.86, 8956.31, 1015.45]

해시셋으로

Set<Double> hashSet = map.values()
                            .stream()
                            .collect(
                                Collectors.toCollection(HashSet::new)
                            );

출력: [2348.26, 8956.31, 1015.45, 1234.86, 7351.03]

priority에 대해서

PriorityQueue<Double> priorityQueue = map.values()
                                            .stream()
                                            .collect(
                                                Collectors.toCollection(PriorityQueue::new)
                                            );

출력: [1015.45, 1234.86, 2348.26, 8956.31, 7351.03]

언급

Java - 패키지 java.util.stream

Java - 패키지 java.util

다음은 최적의 솔루션 중 하나로서 다음과 같습니다.

Collections.list(Collections.enumeration(coll));

언급URL : https://stackoverflow.com/questions/580160/how-to-convert-a-collection-to-list

반응형