2016년 3월 28일 월요일

Java Collection - Set 용법

주요 메소드

일반 array로부터 Set 초기화 하기
  • Arrays.asList() 메소드를 사용한다.

String[] array = {"apple", "orange"};
HashSet<String> set = new HashSet<String>(Arrays.asList(array));


Set으로부터 일반 array 뽑아내기
  • Set의 toArray() 메소드를 사용한다. 

HashSet<String> set;
set.toArray(new String[set.size()]);


EnumSet 순회하기

public static enum MyFruitType {
    ORANGE(0),
    APPLE(1);

    private final int mValue;

    private MyFruitType(int value) {
        this.mValue = value;
    }

    public int getValue() {
        return mValue;
    }
}

for (MyFruitType type : MyFruitType.values()) {
     System.out.println(type.getValue());
}


EnumSet의 enum에 대한 string 얻어오기
  • Enum 값의 toString()을 이용한다.

System.out.println(MyFruitType.ORANGE.toString() + "="
                 + MyFruitType.ORANGE.getValue());


  • 사실 그냥 toString() 없이 enum값 자체를 써도 똑같음 

System.out.println(MyFruitType.ORANGE + "="
                 + MyFruitType.ORANGE.getValue());



TreeSet
  • TreeSet은 SortedSet interface에 대한 구현체이다. SortedSet 구현체로는 ConcurrentSkipListSet, NavigableSet, TreeSet이 있다. 
  • SortedSet의 메소드로는 first(), last(), subSet(E start, E end), tailSet(E start)가 있다. 정렬이 되어 있으니까 순서상 제일 앞의 것, 뒤의 것, 중간 토막, 뒤 토막을 얻어내는 메소드를 제공하는 것이다. 
  • TreeSet은 SortedSet의 메소드를 구현하고 있고 Element는 Comparable<E>을 구현하고 있어야 한다.
  • 많이 사용하는 메소드로서 아래와 같은 것이 있다. 
    • boolean add(E object)
    • E ceiling(E e) // 주어진 e보다 크거나 같은 것들 중 가장 앞의 것 (작은 것), 없으면 null
    • boolean contains(Object object)
    • Iterator<E> iterator(), Iterator<E> descendingIterator()
    • E floor(E e) // 주어진 e보다 작거나 같은 것들 중에서 가장 뒤의 것 (큰 것), 없으면 null
    • E higher(E e) // 주어진 e보다 큰 것들 중에서 가장 앞의 것 (작은 것), 없으면 null
    • E lower(E e) // 주어진 e보다 작은 것들 중에서 가장 뒤의 것 (큰 것), 없으면 null
    • E pollFirst(), E pollLast() // first(), last()와 달리 원소를 제거하면서 가져옴

BitSet
  • bit 단위로 data를 저장하고 조작할 수 있도록 제공되는 class
  • 기본적으로 특정 bit를 조작하는 아래와 같은 메소드들이 있다. 
    • void set(int index) // 특정 bit를 1로 함
    • void set(int index, boolean v) // 특정 bit를 주어진 0 / 1로 함
    • void clear() // 전체를 0으로 함
    • void clear(int index) // 특정 bit를 0으로 함
    • void flip(int index) // 특정 bit를 reverse 함
    • boolean get() // 특정 bit의 값을 읽음
    • void and(BitSet bitSet) // 주어진 BitSet과 and 연산
    • void or(BitSet bitSet) // 주어진 BitSet과 or 연산
    • void xor(BitSet bitSet) // 주어진 BitSet과 xor 연산 
  • 샘플 코드 

BitSet bs1 = new BitSet(16);
BitSet bs2 = new BitSet(16);

// set some bits
for (int i = 0; i < 16; i++) {
    if ((i % 2) == 0) bs1.set(i); // 0101010101010101
    if ((i % 5) != 0) bs2.set(i); // 0111101111011110
}

System.out.println("BitSet 1: " + bs1);
System.out.println("BitSet 2: " + bs2);

bs2.and(bs1);
System.out.println("BitSet 1 AND BitSet 2: " + bs2);

bs2.or(bs1);
System.out.println("BitSet 1 OR BitSet 2: " + bs2);

bs2.xor(bs1);
System.out.println("BitSet 1 XOR BitSet 2: " + bs2);


  • 결과 
BitSet 1: {0, 2, 4, 6, 8, 10, 12, 14}
BitSet 2: {1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
BitSet 1 AND BitSet 2: {2, 4, 6, 8, 12, 14}
BitSet 1 OR BitSet 2: {0, 2, 4, 6, 8, 10, 12, 14}
BitSet 1 XOR BitSet 2: {}


댓글 없음:

댓글 쓰기