Java & Android

Java Set 활용

그레이트쪼 2017. 1. 10. 19:54

Set 

  • 주요 메소드
  • 일반 array로부터 Set 초기화 하기
    • Arrays.asList() 메소드를 사용한다.
1
2
String[] array = {"apple""orange"};
HashSet<String> set = new HashSet<String>(Arrays.asList(array));
  • Set으로부터 일반 array 뽑아내기
    • Set의 toArray() 메소드를 사용한다. 
1
2
HashSet<String> set;
set.toArray(new String[set.size()]);


EnumSet

  • EnumSet 순회하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()을 이용한다.
1
System.out.println(MyFruitType.ORANGE.toString() + "=" + MyFruitType.ORANGE.getValue());
    • 사실 그냥 toString() 없이 enum값 자체를 써도 똑같음 
1
System.out.println(MyFruitType.ORANGE + "=" + MyFruitType.ORANGE.getValue());
cs



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 연산 
  • 샘플 코드 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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: {}



비교 메소드 overriding

  • HashSet, HashMap, HashTable의 경우 hashCode()도 구현해야 한다. 
  • contains() 같은 경우 일단 hashCode()로 일차 비교하고 최종으로 equals() 사용한다. 즉 둘다 쓴다. 
  • ArrayList는 contains를 위해 모든 원소와 equals() 연산을 수행한다. (비효율)
  • 반면 TreeSet은 comparer 추가적으로 구현해야 한다. 
  • http://tutorials.jenkov.com/java-collections/hashcode-equals.html