컬렉션을 목록으로 변환하는 방법
사용하고 있다TreeBidiMap
Apache Collections 라이브러리에서 가져옵니다.나는 이것을 다음의 값에 따라 분류하고 싶다.doubles
.
내 방법은 다음 중 하나를 검색하는 것입니다.Collection
값을 지정합니다.
Collection coll = themap.values();
자연스럽게 잘 작동하죠.
주요 질문:변환/캐스팅 방법을 알고 싶습니다(어느 것이 맞는지 잘 모르겠습니다).coll
에List
정리할 수 있게?
그리고 나서 나는 분류된 것들을 반복할 생각이다.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]
언급
다음은 최적의 솔루션 중 하나로서 다음과 같습니다.
Collections.list(Collections.enumeration(coll));
언급URL : https://stackoverflow.com/questions/580160/how-to-convert-a-collection-to-list
'sourcecode' 카테고리의 다른 글
개발 모드에서 이 HTML 템플릿을 컴파일하는 데 Vue가 매우 느림 (0) | 2022.07.17 |
---|---|
스프링 컨트롤러에서 파일 다운로드 (0) | 2022.07.17 |
vue.timeout의 구성 요소에 개체 배열 전달 (0) | 2022.07.17 |
JPA의 맵 열거형(고정값 포함)을 지정하시겠습니까? (0) | 2022.07.17 |
"2i;"라는 문장이 컴파일러 오류를 일으키지 않는 이유는 무엇입니까? (0) | 2022.07.17 |