John Squirrels
레벨 41
San Francisco

자바 세트

무작위의 그룹에 게시되었습니다
회원
Set은 Java Collection Framework의 인터페이스입니다. Java Set을 사용하여 고유한 요소가 있는 정렬되지 않은 컬렉션을 구현할 수 있습니다. 이 기사에서는 이 인터페이스와 Java 언어로 구현된 인터페이스, 세트 작업 방법을 살펴보고 몇 가지 예를 제공합니다.

자바 세트란?

Set 은 Java Collection Framework의 인터페이스이지만 List 달리 순서가 지정된 컬렉션이 아닙니다 . 이는 Java Set 요소가 특정 순서 없이 유지됨을 의미합니다. 따라서 요소를 삽입할 수 있는 위치를 제어할 수 없습니다. 또한 색인으로 요소에 액세스할 수 없습니다. 수학적으로 집합은 고유한 요소의 모음입니다. 사실 이것은 동일한 요소를 저장할 수 없는 정렬되지 않은 컬렉션(unordered Collection)입니다. Set 에 의도적으로 중복 요소를 추가하면 이 작업이 무시되고 Set 이 변경되지 않습니다. 그러나 하나의 null 요소를 저장할 수 있습니다.

구현 설정

Java Set 은 인터페이스이므로 해당 구현 중 하나를 사용하여 객체를 생성해야 합니다. 이들은 HashSet , TreeSetLinkedHashSet 입니다 . Set s 에서 각 요소는 하나의 인스턴스에만 저장되며 Set의 다른 구현은 요소 저장에 다른 순서를 사용합니다. HashSet 에서 요소의 순서는 복잡한 알고리즘에 의해 결정됩니다. 저장 순서가 중요한 경우 비교 순서에서 오름차순으로 정렬된 개체를 저장하는 TreeSet 컨테이너 또는 LinkedHashSet 을 사용하십시오., 추가 순서로 요소를 저장합니다. 집합은 개체가 주어진 집합에 속하는지 쉽게 확인할 수 있도록 멤버십 테스트에 자주 사용되므로 실제로는 빠른 조회에 최적화된 HashSet 구현이 일반적으로 선택됩니다. HashSet은 hashCode() 메서드가 반환한 해시 값을 사용하여 내부적으로 요소를 저장하는 컬렉션입니다 . 즉, HashSet<E> 내부에는 HashSet 의 값을 키로 저장하는 HashMap <E, Object> 객체가 저장됩니다. 해시 코드를 사용하면 Set 에서 요소를 빠르게 검색, 추가 및 제거할 수 있습니다 . LinkedHashSet 은 HashSet 입니다.또한 연결된 목록에 요소를 저장합니다. 일반 HashSet은 요소 순서를 유지하지 않습니다. 첫째, 공식적으로는 단순히 존재하지 않으며 둘째, 요소 하나만 추가해도 내부 질서가 크게 바뀔 수 있습니다. 그리고 LinkedHashSet 에서 반복자를 가져와 LinkedHashSet 에 추가된 정확한 순서로 모든 요소를 ​​통과하는 데 사용할 수 있습니다 . 자주는 아니지만 때로는 매우 필요할 수 있습니다. TreeSet은 요소를 값 순서 트리로 저장하는 컬렉션입니다. TreeSet<E> 내부에는 이러한 모든 값을 저장하는 TreeMap<E, Object> 가 있습니다 . 그리고 이 트리맵Red-Black Balanced Binary Tree를 사용하여 요소를 저장합니다. 따라서 매우 빠른 add() , remove() , contains() 작업이 있습니다.

세트 개체 만들기

Set Object를 만들려면 다음 형식 중 하나를 사용할 수 있습니다.
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
다음은 2개의 Set , HashSetLinkedHashSet을 만들고 각각에 5개의 요소를 추가하는 간단한 예입니다. 이를 위해 add() 메서드를 사용할 수 있습니다 .
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
다음은 프로그램의 출력입니다.
[알렉스, 이고르, 스튜어트, 조니, 벨] [스튜어트, 알렉스, 조니, 이고르, 벨]
위에서 언급했듯이 HashSet은 요소의 순서를 유지하지 않지만 LinkedHashSet 은 유지합니다. 우리가 세트에 쓴 순서대로 요소를 제공한 것은 LinkedHashSet 이었습니다 .

자바 설정 방법

다음은 Java Set의 중요한 메소드 중 일부입니다 .
  • 부울 추가(E e) . 아직 존재하지 않는 경우 지정된 요소를 집합에 추가합니다(선택적 작업).

  • 부울 제거(객체 o) . 지정된 요소가 있는 경우 이 집합에서 해당 요소를 제거합니다(선택적 작업).

  • 부울 removeAll(컬렉션 c) . 지정된 컬렉션에 포함된 모든 요소를 ​​이 집합에서 제거합니다(선택적 작업).

  • boolean retainAll(컬렉션 c) . 지정된 컬렉션에 포함된 이 집합의 요소만 유지합니다(선택적 작업).

  • 무효 클리어() . 집합에서 모든 요소를 ​​제거합니다.

  • 반복자 iterator() . 이 집합의 요소에 대한 반복자를 반환합니다.

  • 정수 크기() . Set의 요소 수를 가져오는 데 사용됩니다.

  • 부울 isEmpty() . Set이 비어 있는지 확인합니다.

  • 부울 포함(객체 o) . 이 Set에 지정된 요소가 포함되어 있으면 true를 반환합니다.

  • 반복자 iterator() . 이 집합의 요소에 대한 반복자를 반환합니다. 요소는 특별한 순서 없이 반환됩니다.

  • Object[] toArray() . 이 집합의 모든 요소를 ​​포함하는 배열을 반환합니다. 이 세트가 반복자에 의해 요소가 반환되는 순서를 보장하는 경우 이 메서드는 요소를 동일한 순서로 반환해야 합니다.

메서드는 ArrayList 의 메서드와 비슷 하지만 add(Object o) 메서드는 개체가 아직 없는 경우에만 개체를 ​​집합에 추가한다는 점만 다릅니다. 메서드의 반환 값은 개체가 추가된 경우 true이고 그렇지 않으면 false입니다. Collection<> 인터페이스 에서 상속된 몇 가지 메소드도 있습니다 : java.lang.Iterable 인터페이스 에서 상속된 parallelStream() , removeIf() , stream()forEach() 메소드 .

Java Set 기본 작업 예제

이 예제에서는 문자열 배열을 만든 다음 Arrays.asList 작업을 사용하여 mySet 에 전달합니다 . 그런 다음 요소를 몇 개 더 제거하고 몇 개 더 추가합니다. 이 경우 세트의 요소 중 하나가 이미 존재하므로 추가되지 않습니다. 우리는 또한 isEmpty() 의 공허함을 확인하고 set size() 의 크기를 결정 하고 모든 요소 clear() 의 집합을 지우는 작업을 시도할 것입니다 .
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
프로그램의 출력은 다음과 같습니다.
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] 세트의 요소 수 = 5 mySet이 비어 있습니까? false Igor가 설정되었습니까? false Johnny가 설정되었습니까? true 지금 mySet이 비어 있습니까? 진실

LinkedHashSet 및 Array로 설정된 예

다른 프로그램을 작성해 봅시다. 여기에서 LinkedHashSet을 기반으로 세트를 생성하고 여기에 요소를 추가한 다음 세트를 배열로 변환합니다.
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
다음은 프로그램의 출력입니다.
[C, D, E, F, G, A, B] false 요소가 제거된 집합 인쇄: [C, D, E, G, A, B] 집합의 새 배열: [C, D, E, G, A, B] C

반복자로 예제 설정

집합을 만든 다음 반복자를 사용하여 출력한 다음 반복자를 사용하여 모든 짝수를 제거합니다.
import java.util.*;

public class SetTest5
{
   public static void main(String[] args)
   {

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
프로그램의 출력은 다음과 같습니다.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9]

TreeSet의 예

정렬이 중요한 경우 TreeSet 구현을 사용하십시오. 이 짧은 예에서는 이전 예에서와 같이 친구 이름으로 세트를 채울 것입니다. 그러나 정렬된 TreeSet 에서 요소는 즉시 정렬된 순서로 작성됩니다. 이 경우 이름은 알파벳순으로 표시됩니다.
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
출력은 다음과 같습니다.
[알렉스, 벨, 이고르, 조니, 스튜어트]

간략한 결론

  • Java Set 인터페이스는 Java Collections Framework의 일부입니다.

  • 구현된 클래스: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • 가장 인기 있는 Set 구현은 HashSet , LinkedHashSetTreeSet 입니다 .

  • HashSet 요소 순서는 복잡한 알고리즘에 의해 결정됩니다. 저장 순서가 중요한 경우 오름차순으로 정렬된 개체를 비교 순서로 저장하는 TreeSet 컨테이너 또는 추가 순서로 요소를 저장하는 LinkedHashSet 을 사용하십시오.

  • 대부분의 경우 세트는 멤버십을 테스트하는 데 사용됩니다. 즉, 개체가 수학적 의미에서 주어진 집합에 속하는지 여부를 확인하는 것입니다. 따라서 실제로 모든 Set 구현 중에서 가장 자주 HashSet이 일반적으로 선택됩니다. 이 구현은 빠른 검색에 최적화되어 있습니다.

  • 세트에 중복 요소를 추가할 수 없으므로 Set 인터페이스의 구현을 사용하여 고유한 요소를 저장할 수 있습니다.

  • 설정을 사용 하면 하나의 null 요소만 추가할 수 있습니다.

  • Set은 목록이 아니며 해당 요소의 인덱스 또는 위치를 지원하지 않습니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다