HashSet 정렬 방법
「」를 합니다.Collections.sort(List)
방법.예를 들어, 데이터 베이스의HashSet
HashSet은 요소의 순서를 보증하지 않습니다.이 보증이 필요한 경우 TreeSet을 사용하여 요소를 보관하는 것이 좋습니다.
단, 이 경우 요소를 정렬해야 하는 경우에는 일시적으로 목록을 작성하여 다음 항목을 정렬합니다.
Set<?> yourHashSet = new HashSet<>();
...
List<?> sortedList = new ArrayList<>(yourHashSet);
Collections.sort(sortedList);
모든 개체를 에 추가하면 정렬된 세트가 나타납니다.다음은 미가공의 예입니다.
HashSet myHashSet = new HashSet();
myHashSet.add(1);
myHashSet.add(23);
myHashSet.add(45);
myHashSet.add(12);
TreeSet myTreeSet = new TreeSet();
myTreeSet.addAll(myHashSet);
System.out.println(myTreeSet); // Prints [1, 12, 23, 45]
갱신하다
또, 의 컨스트럭터를 사용하면, 다음의 작업을 실시할 수도 있습니다.HashSet
파라미터로 지정합니다.
HashSet myHashSet = new HashSet();
myHashSet.add(1);
myHashSet.add(23);
myHashSet.add(45);
myHashSet.add(12);
TreeSet myTreeSet = new TreeSet(myHashSet);
System.out.println(myTreeSet); // Prints [1, 12, 23, 45]
@mounika님 업데이트 감사합니다.
Java 8의 정렬 방법은 다음과 같습니다.
fooHashSet.stream()
.sorted(Comparator.comparing(Foo::getSize)) //comparator - how you want to sort it
.collect(Collectors.toList()); //collector - what you want to collect it to
*Foo::getSize
이것은 YourItem의 해시셋을 크기별로 자연스럽게 정렬하는 예입니다.
*Collectors.toList()
는 정렬 할 때 한 정보를 할 수 .List<Foo> sortedListOfFoo =
대신 TreeSet을 사용할 수 있습니다.
java.util.TreeSet
실제 대상으로 합니다.이 컬렉션에 대해 반복하면 값이 제대로 정의된 순서로 반환됩니다.
「 」를 사용하고 java.util.HashSet
순서는 내부 해시 함수에 따라 달라지는데, 내부 해시 함수는 거의 확실히 사전 편찬(콘텐츠에 기반)이 아닙니다.
, TreeSet
간결한 코드를 위해 자바 스트림을 사용하여 시도할 수 있습니다.
set = set.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new));
Java 8 수집기와 Tree Set을 사용할 수 있습니다.
list.stream().collect(Collectors.toCollection(TreeSet::new))
@LazerBanana의 답변을 바탕으로 오브젝트 ID에 따라 정렬된 세트의 예를 나타냅니다.
Set<Clazz> yourSet = [...];
yourSet.stream().sorted(new Comparator<Clazz>() {
@Override
public int compare(Clazz o1, Clazz o2) {
return o1.getId().compareTo(o2.getId());
}
}).collect(Collectors.toList()); // Returns the sorted List (using toSet() wont work)
HashSet의 요소를 정렬할 수 없습니다.HashSet에 요소를 넣을 때마다 세트 전체의 순서가 엉망이 될 수 있습니다.퍼포먼스를 위해 일부러 그렇게 설계되어 있습니다.순서를 신경 쓰지 않는 경우, HashSet는 빈번한 삽입 및 쿼리에 가장 효율적인 세트입니다.
TreeSet을 대신 사용할 수 있습니다.트리 세트에서 반복하면 정렬된 요소가 자동으로 표시됩니다.그러나 요소를 삽입할 때마다 정렬된 상태로 유지되도록 트리가 조정됩니다.
어쩌면 당신이 하려는 것은 한 번만 분류하는 것일지도 모릅니다.이 경우 Tree Set은 항상 새로 추가된 요소의 배치를 결정해야 하므로 가장 효율적인 옵션이 아닙니다.자주 정렬하려는 경우에만 TreeSet을 사용하십시오.
정렬이 1회만 필요한 경우 ArrayList를 사용합니다.새 목록을 만들고 모든 요소를 추가한 후 한 번 정렬합니다.고유한 요소만 유지하고(모든 중복을 제거) 목록을 LinkedHashSet에 넣는 경우 이미 정렬된 순서가 유지됩니다.
List<Integer> list = new ArrayList<>();
list.add(6);
list.add(4);
list.add(4);
list.add(5);
Collections.sort(list);
Set<Integer> unique = new LinkedHashSet<>(list); // 4 5 6
이제 정렬된 세트를 얻을 수 있습니다. 목록 형식으로 원하는 경우 목록으로 변환합니다.
TreeSet은 다른 답변과 같이 사용할 수 있습니다.
다음은 사용 방법에 대한 자세한 설명입니다.
TreeSet<String> ts = new TreeSet<String>();
ts.add("b1");
ts.add("b3");
ts.add("b2");
ts.add("a1");
ts.add("a2");
System.out.println(ts);
for (String s: ts)
System.out.println(s);
출력:
[a1, a2, a3, a4, a5]
a1
a2
b1
b2
b3
저의 겸손한 의견으로는, LazerBanana의 답변은 최고 등급의 답변이어야 하며 받아들여져야 합니다. 왜냐하면 다른 모든 답변은 다음을 가리키고 있기 때문입니다.java.util.TreeSet
(또는 처음에 리스트로 변환한 후 콜)Collections.sort(...)
변환 리스트)는 OP에게 어떤 종류의 오브젝트인지 물어보는 것을 꺼리지 않았습니다.HashSet
예를 들어, 이러한 요소에 미리 정의된 자연스러운 순서가 있는지 아닌지는 옵션 질문이 아니라 필수 질문입니다.
그냥 들어가서는 안쪽으로 들어가서HashSet
요소에서 a로TreeSet
요소 유형이 아직 구현되지 않은 경우Comparable
인터페이스 또는 명시적으로 패스하지 않은 경우Comparator
로.TreeSet
컨스트럭터
부터TreeSet
Java Doc,
요소의 자연스러운 순서에 따라 정렬된 빈 새 트리 세트를 구성합니다.세트에 삽입된 모든 요소는 Comparable 인터페이스를 구현해야 합니다.또한 이러한 모든 요소는 서로 비교할 수 있어야 합니다.e1.compareTo(e2)는 세트 내의 요소 e1 및 e2에 대해 ClassCastException을 슬로우해서는 안 됩니다.사용자가 이 제약조건을 위반하는 요소를 세트에 추가하려고 하면(예를 들어 요소가 정수인 세트에 문자열 요소를 추가하려고 하는 경우), 추가 콜은 ClassCastException을 슬로우합니다.
따라서 비교기를 즉석에서 정의하는 모든 Java8 스트림 기반 답변만이 의미가 있습니다. POJO에서의 동등한 구현은 선택사항이 되기 때문입니다.프로그래머는 필요에 따라 비교기를 정의합니다.수집을 시도하고 있습니다.TreeSet
이 근본적인 질문도 하지 않고 (닌자의 답변) 틀렸습니다.오브젝트 타입을 전제로 합니다.String
또는Integer
또한 올바르지 않습니다.
그렇다고는 해도, 다른 걱정거리도 있습니다.
- 정렬 퍼포먼스
- 메모리 풋 프린트(원래 세트를 유지하고 정렬이 완료될 때마다 정렬된 새 세트를 작성하거나 세트 정렬을 원하는 경우 등)
다른 관련 사항도 고려해야 합니다.API를 가리킨다고 해서 의도적인 것만은 아닙니다.
원본 세트에는 이미 고유한 요소만 포함되어 있으며 이 제약조건도 정렬된 세트에 따라 유지되므로 데이터가 복제되므로 원본 세트를 메모리에서 삭제해야 합니다.
1. Add all set element in list -> al.addAll(s);
2. Sort all the elements in list using -> Collections.sort(al);
public class SortSetProblem {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList();
Set<String> s = new HashSet<>();
s.add("ved");
s.add("prakash");
s.add("sharma");
s.add("apple");
s.add("ved");
s.add("banana");
System.out.println("Before Sorting");
for (String s1 : s) {
System.out.print(" " + s1);
}
System.out.println("After Sorting");
al.addAll(s);
Collections.sort(al);
for (String set : al) {
System.out.print(" " + set);
}
}
}
입력 - ved prakash sharma 애플 ved 바나나
출력 - 사과 바나나 프라카쉬 샤르마 ved
을 Collection
의 형태를 띠다Set
만의 정의를 내리고 natural order
의 그것보다는TreeSet
- - - -
HashSet
List
- 「」의 커스텀
List
를 사용합니다.Comparator
List
LinkedHashSet
를 유지하다- 표시해 주세요.
LinkedHashSet
프로그램 - ★★★★★★★★★★★★★★★★★★★★-
package demo31;
import java.util.*;
public class App26 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
addElements(set);
List<String> list = new LinkedList<>();
list = convertToList(set);
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int flag = s2.length() - s1.length();
if(flag != 0) {
return flag;
} else {
return -s1.compareTo(s2);
}
}
});
Set<String> set2 = new LinkedHashSet<>();
set2 = convertToSet(list);
displayElements(set2);
}
public static void addElements(Set<String> set) {
set.add("Hippopotamus");
set.add("Rhinocerous");
set.add("Zebra");
set.add("Tiger");
set.add("Giraffe");
set.add("Cheetah");
set.add("Wolf");
set.add("Fox");
set.add("Dog");
set.add("Cat");
}
public static List<String> convertToList(Set<String> set) {
List<String> list = new LinkedList<>();
for(String element: set) {
list.add(element);
}
return list;
}
public static Set<String> convertToSet(List<String> list) {
Set<String> set = new LinkedHashSet<>();
for(String element: list) {
set.add(element);
}
return set;
}
public static void displayElements(Set<String> set) {
System.out.println(set);
}
}
출력 -
[Hippopotamus, Rhinocerous, Giraffe, Cheetah, Zebra, Tiger, Wolf, Fox, Dog, Cat]
여기서 컬렉션은 다음과 같이 정렬됩니다.
번째 - - 내림차순String
조절
번째 - - 내림차순String
이것은, 다음의 방법으로 실시할 수 있습니다.
방법 1:
- 목록을 만들고 모든 해시 집합 값을 저장합니다.
- Collections.sort()를 사용하여 목록을 정렬합니다.
- 삽입 순서를 유지하므로 목록을 LinkedHashSet에 다시 저장합니다.
방법 2:.
- treeSet을 만들고 모든 값을 treeSet에 저장합니다.
다른 방법은 해시 집합과 목록 간에 데이터를 주고받는 데 많은 시간이 소요되므로 방법 2가 더 좋습니다.
HashSet의 요소가 자동으로 정렬될지는 결정할 수 없습니다.단, TreeSet 또는 ArrayList, LinkedList 등의 목록으로 변환하여 정렬할 수 있습니다.
// Create a TreeSet object of class E
TreeSet<E> ts = new TreeSet<E> ();
// Convert your HashSet into TreeSet
ts.addAll(yourHashSet);
System.out.println(ts.toString() + "\t Sorted Automatically");
guava 라이브러리를 동일하게 사용할 수 있습니다.
Set<String> sortedSet = FluentIterable.from(myHashSet).toSortedSet(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
// descending order of relevance
//required code
}
});
SortedSet은 java 7 https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html부터 추가되었습니다.
다음과 같이 TreeSet으로 래핑할 수 있습니다.
Set mySet = new HashSet();
mySet.add(4);
mySet.add(5);
mySet.add(3);
mySet.add(1);
System.out.println("mySet items "+ mySet);
TreeSet treeSet = new TreeSet(mySet);
System.out.println("treeSet items "+ treeSet);
표시:
아이템 , mySet 항 [ [ 1, 3, 4, 5 ]
3, 4, 항목 [1, 3, 4, 5]
Set mySet = new HashSet();
mySet.add("five");
mySet.add("elf");
mySet.add("four");
mySet.add("six");
mySet.add("two");
System.out.println("mySet items "+ mySet);
TreeSet treeSet = new TreeSet(mySet);
System.out.println("treeSet items "+ treeSet);
표시:
아이템 , mySet [6, 4, 5, 2, ]
설정 , 항목 설정 [elf, 5, 4, 6, 2]
이 메서드의 요건은 set/list 객체가 비교 가능해야 한다는 것입니다(Comparable 인터페이스 구현).
아래는 샘플 코드이며, 이미 코멘트로 코드를 포인팅하여 답변하였습니다.완전한 코드가 포함되어 있기 때문에 아직 공유 중입니다.
package Collections;
import java.util.*;
public class TestSet {
public static void main(String[] args) {
Set<String> objset = new HashSet<>();
objset.add("test");
objset.add("abc");
objset.add("abc");
objset.add("mas");
objset.add("vas");
Iterator itset = objset.iterator();
while(itset.hasNext())
{
System.out.println(itset.next());
}
TreeSet<String> treeobj = new TreeSet(objset);
System.out.println(treeobj);
}
}
TreeSet treeobj = new TreeSet(objset)입니다.여기에서는 오브젝트를 추가하기 위해 addAll 메서드를 호출하는 트리셋 생성자를 호출합니다.
TreeSet 클래스의 다음 코드를 참조하십시오.
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
★★HashSet
로로 합니다.List
그런 다음 을 사용하여 정렬합니다.Collection.sort()
List<String> list = new ArrayList<String>(hset);
Collections.sort(List)
이 간단한 명령으로 저는 성공했습니다.
myHashSet.toList.sorted
프린트 스테이트먼트내에서 사용하고 있기 때문에, 실제로 주문을 계속할 필요가 있는 경우는, TreeSet 등, 이 스레드에 제안되고 있는 구조를 사용할 필요가 있는 경우가 있습니다.
언급URL : https://stackoverflow.com/questions/22391350/how-to-sort-a-hashset
'IT' 카테고리의 다른 글
JSDoc: 개체 구조를 반환합니다. (0) | 2022.10.29 |
---|---|
배열에서 스트리밍할 때 정수를 문자열에 매핑할 수 없는 이유는 무엇입니까? (0) | 2022.10.29 |
Intelij 코드 포맷, 새 줄의 Java 주석 (0) | 2022.10.29 |
JS를 사용하여 HTML 문자열 구문 분석 (0) | 2022.10.29 |
게터와 세터? (0) | 2022.10.29 |