passion and relax

[JAVA] 16. 자료구조 (컬렉션 및 제네릭) 본문

프로그래밍

[JAVA] 16. 자료구조 (컬렉션 및 제네릭)

Grab Java 2024. 6. 4. 11:07

1. Class로 구성된 Collection의 정렬 (한가지 방법으로만 정렬하는 경우)

class Song implements Comparable<Song> {
    String title;
    String artist;

    @Override
    public int compareTo(Song s) {
        return title.compareTo(s.getTitle());
    }
}

 

ArrayList<Song> songArrayList = new ArrayList(Arrays.asList(new Song("bb", "bbb"), new Song("aa", "aaa")));
System.out.println(songArrayList);
Collections.sort(songArrayList);
System.out.println(songArrayList);

 


2. String으로 구성된 Collection의 정렬 (String에는 이미 compareTo()가 정의되어 있다)

ArrayList의 경우, 생성과 동시에 원소 넣기

ArrayList<String> songArrayList = new ArrayList(Arrays.asList("ccc", "bbb", "aaa"));
System.out.println(songArrayList);
Collections.sort(songArrayList);
System.out.println(songArrayList);


List의 경우, 생성과 동시에 원소 넣기

List<String> songList = Arrays.asList("cccc", "bbbb", "aaaa");
System.out.println(songList);
Collections.sort(songList);
System.out.println(songList);

 


3. Class로 구성된 Collection의 정렬 (여러가지 방법으로 정렬하는 경우)

ArrayList<Song> songArrayList = new ArrayList(Arrays.asList(new Song("bb", "ccc"), new Song("aa", "ddd")));
System.out.println(songArrayList);

class TitleCompare implements Comparator<Song> {
    @Override
    public int compare(Song o1, Song o2) {
        return o1.getTitle().compareTo(o2.getTitle());
    }
}
       
class ArtistCompare implements Comparator<Song> {
    @Override
    public int compare(Song o1, Song o2) {
        return o1.getArtist().compareTo(o2.getArtist());
    }
}
       
Collections.sort(songArrayList, new TitleCompare());
System.out.println(songArrayList);
Collections.sort(songArrayList, new ArtistCompare());
System.out.println(songArrayList);

* class Song 은 손댈 필요 없다.

 


Collection

Set (interface)
    LinkedHashSet
    HashSet
    SortedSet (interface)
        TreeSet
List (interface)
    ArrayList
    LinkedList

TreeSet

. 원소가 Comparable을 implement 한 후, compareTo()를 override 하거나,
=> Class로 구성된 Collection의 정렬 (한가지 방법으로만 정렬하는 경우)
. 생성할 때 Comparator를 implement 한 후, compare()를 override 한 클래스를 생성자로 넣어야 함.
=> Class로 구성된 Collection의 정렬 (여러가지 방법으로 정렬하는 경우)

 

public class BookCompare implements Comparator<Book> {
    public int compare(Book one, Book two) {
        return (one.title.compareTo(two.title));
    }
}
BookCompare bCompare = new BookCompare();
TreeSet<Book> tree = new TreeSet<Book>(bCompare);

 


제네릭 와일드 카드

public void takeAnimals (ArrayList<? extends Animal> animals) {
    for (Animal a : animals) { a.eat(); }  //참조하는 것은 가능
    animals.add (new Cat());  //넘어온 매개변수를 변경하는 것은 불가능. 컴파일 에러.
}
public <T extends Animal> void takeThing (ArrayList<T> list)  이거와
public void takeThing (ArrayList<? extends Animal> list)  이거는 동일함.
public <T extends Animal> void takeThing (ArrayList<T> one, ArralyList<T> two)
여러 번 써야하는 경우를 위해 필요함.

 


Array2ArrayList

String[] arrStringS = {"String01", "String02"};
ArrayList<String> arrlistStringS = new ArrayList(Arrays.asList(arrStringS));

 


 Set2Array (String 자료형 유지)

Set<String> arrPubmedIds = new HashSet();
setPubmedIds.add("id01");
setPubmedIds.add("id02");

String[] arrPubmedIds = new String[setPubmedIds.size()];
arrPubmedIds = (String[]) setPubmedIds.toArray(arrPubmedIds);

 


Set2Array (Object 자료형으로 변형 : 출력 시 동일함)

Set<String> arrPubmedIds = new HashSet();
setPubmedIds.add("id01");
setPubmedIds.add("id02");

Object[] arrObjects = (Object[]) setPubmedIds.toArray();

 


Set2Array 후, 하나의 요소만 꺼내오기

Set<String> arrPubmedIds = new HashSet();
setPubmedIds.add("id01");
setPubmedIds.add("id02");

String idxZero = (String) setPubmedIds.toArray()[0];
String idxOne = (String) setPubmedIds.toArray()[1];

 


case insensitive Set

Set<String> mySet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
contains등의 method에서 case insensitive하게 반응.

 


case insensitive Map

import org.apache.commons.collections.map.CaseInsensitiveMap;
...
Map<String, List<String>> xIdToYIdList = new CaseInsensitiveMap();