레이블이 library인 게시물을 표시합니다. 모든 게시물 표시
레이블이 library인 게시물을 표시합니다. 모든 게시물 표시

2019-03-26

Comparable, Comparator

핵심

객체가 정렬될때, 사용자의 의도에 따라 정렬 구조를 변경할 수 있도록 지원되는 인터페이스

기본 코드

public static void main(String[] args) {
    List<Player> footballTeam = new ArrayList<>();
    Player player1 = new Player(59, "John", 20);
    Player player2 = new Player(67, "Roger", 22);
    Player player3 = new Player(45, "Steven", 24);
    footballTeam.add(player1);
    footballTeam.add(player2);
    footballTeam.add(player3);
 
    System.out.println("Before Sorting : " + footballTeam);
    Collections.sort(footballTeam);
    System.out.println("After Sorting : " + footballTeam);
}
public class Player {
    private int ranking;
    private String name;
    private int age;  
    Player(int ranking, String name, int age){
     // constructor
    }
    // getters, setters  
}

Comparable

정의

구현되는 클래스의 기본 정렬기준을 별도로 구현
정렬 기준을 변경하기 위해 정렬대상에게 Comparable 인터페이스의 compareTo(Object obj) 를 구현한다. 해당 메서드에서 비교 대상의 개체가 인수로 전달되는 개체보다 작거나 같은지 또는 큰지 여부를 나타내는 숫자로 반환한다.

코드

public class Player implements Comparable<Player> {
    @Override
    public int compareTo(Player otherPlayer) {
     // ranking 값이 작은 순으로 정렬
        return (this.getRanking() - otherPlayer.getRanking());
    }
}
Before Sorting : [John, Roger, Steven]
After Sorting : [Steven, John, Roger]

Comparator

정의

기존에 Comparable의 compareTo로 구현된 것이 아닌 별도의 정렬기준을 적용할때

코드

익명 클래스로 선언하여 사용편리
Collections.sort(playerList, new Comparator<Player>(){
    @Override
    public int compare(Player firstPlayer,Player secondPlayer){
        return (firstPlayer.getRanking() - secondPlayer.getRanking());
    }
});
Lambda 사용시
Collections.sort(playerList,(firstPlayer, secondPlayer) -> firstPlayer.getRanking() - secondPlayer.getRanking());

참조

Collections

Collections

classDiagram
Iterable <|-- Collection
Collection <|-- Set
Set <-- AbstractSet
AbstractSet <|-- HashSet
HashSet <|-- LinkedHashSet
Set <|-- SortedSet
SortedSet <|-- NavigableSet
NavigableSet <-- TreeSet

Collection <|-- List
List <-- AbstractList
List <|-- ArrayList
List <|-- Vector
Vector <|-- Stack
List <|-- AbstractSequentialList
AbstractSequentialList <|-- LinkedList

Collection <|-- Queue
Queue <|-- Deque
Deque <-- LinkedList
Deque <-- ArrayDeque

Iterable: <interface>
Collection: <interface>
List: <interface>
Set: <interface>
SortedSet: <interface>
NavigableSet: <interface>
Queue: <interface>
  • Iterable : 컬렉션에 대한 반복 처리를 제공합니다.
  • Collection : 개체의 추가 및 제거, 컬렉션 내에 개체 포함여부, 컬렉션의 개체 개수 등의 기능을 제공합니다.
  • Set : 개체의 중복을 허용하지 않습니다.
    • HashSet : Hashing 을 통해 구현되었으며 개체의 순서를 보장하지 않습니다.
      Hashing
      해시함수(hash function)란 데이터의 효율적 관리를 위해 key를 고정된 길이의 hash로 매핑하는 함수입니다. 이 때 매핑 전 원래 데이터의 값을 키(key), 매핑 후 데이터의 값을 해시값(hash value), 매핑하는 과정 자체를 해싱(hashing) 이라고 합니다. 키값 중복으로 인해 hash 값에 대해 충돌이 발생할 수 있습니다.
      Imgur
    • LinkedHashSet : double-linked list 로써 개체간의 순서를 보장합니다.
    • TreeSet : 이진탐색트리(BinarySearchTree)의 형태로 데이터를 저장하며 순서를 유지하지 않습니다.
      이진탐색 (BinarySearch)
      추가작성
      이진탐색트리 (BinarySearchTree) 참조
      이진탐색(binary search)과 연결리스트(linked list)를 결합한 자료구조의 일종입니다. 이진탐색의 추가 / 삭제시 단점을 개선하였습니다.
  • List : 정렬된 순차 컬랙션입니다.
    • ArrayList : 유동적 길이를 가진 배열입니다.
    • Vector : ArrayList 와 비슷하게 유동적인 배열입니다. Thread-safe 나 Synchronization 을 위해서 사용됩니다.
    • Stock : LIFO(Last-In-First-Out) 형태의 배열입니다. _Vector_의 하위클래스로서 Thread-safe 합니다.
    • LikedList : double-linked list 로 개체간에 연결되어 있습니다. 그로인해 intermediate 위치에 추가 / 삭제가 빠릅니다. Deque 클래스도 구현합니다
  • Queue : FIFO (First-In-First-Out) 형태의 배열입니다. Typical usage is storage to hold elements before processing in the order of receipt.
    • Deque(Double-Ended-Queue) : can add and remove elements at both ends.
    • ArrayDeque : implementation of Deque using an array for storage.

Map

classDiagram
Map <-- AbstractMap
AbstractMap <|-- HashMap
HashMap <-- LinkedHashMap

Map <-- SortedMap
SortedMap <-- NavigableMap
AbstractMap <|-- TreeMap
NavigableMap <-- TreeMap

Map: <interface>
AbstractMap: <abstract>
SortedMap: <interface>
NavigableMap: <interface>
  • Map : 키(key)와 값(value)으로 개채 관리합니다.
  • AbstractMap :
    • HashMap : Map 인터페이스 구현을 위해 _HashTable 을 사용하였습니다. 중복을 허용하지 않으며 키와 값에 null을 허용합니다.
    • HashTable : HashMap 보다는 느리지만 Synchronization가 지원됩니다.
    • LinkedHashMap : _double-linked list_로써 키 간에 순서를 보장합니다.
    • TreeMap - 이진트리검색의 형태로 키/값 쌍으로 이루어진 개체를 저장합니다. 검색, 정렬이 뛰어나나 개체 추가/삭제는 시간이 소요됩니다.

참조

데이터의 시각화, D3

D3

D3(Data-Driven Documents).js는 은 웹 표준을 사용하여 데이터를 시각화하는 JavaScript 라이브러리입니다. SVG, Canvas 및 HTML을 사용하여 데이터를 실제로 사용할 수 있도록 도와줍니다. 강력한 시각화 및 상호 작용 기술과 DOM 조작에 대한 데이터 중심 접근 방식을 결합하여 최신 브라우저의 모든 기능을 제공하고 데이터에 적합한 시각적 인터페이스를 자유롭게 설계 할 수 있습니다.

API Reference

아래의 기준에따라 시각화를 분류할 수 있습니다.
Gallery 에서 데이터들을 정렬한 방식들을 확인할 수 있습니다.

markdown 기반 flow chart, mermaid

mermaid

markdown 기반 flow chart, sequence / class diagram, gantt chart, git graph 등을 표현할 수 있는 API

Flowchart #


Link text
One
Two
Hard edge
Round edge
Decision
Result one
Result two

Sequence Diagram#

AliceJohnHello John, how are you?Great!AliceJohn

Ganttchart#

2014-01-072014-01-092014-01-112014-01-132014-01-152014-01-172014-01-192014-01-21Completed task Active task Future task Future task2 Completed task in the critical line Implement parser and jison Create tests for parser Future task in critical line Create tests for renderer Add to mermaid A sectionCritical tasksAdding GANTT diagram functionality to mermaid

Blog Setting

mermaid.initialize({ startOnLoad:true, theme: 'forest' });
window.mermaid.init(undefined, document.querySelectorAll('.language-mermaid'));
현재 이 블로그에서 위와 같은 설정을 통해 markdown 방식으로 아래와 같은 형태로 사용 가능
```mermaid
sequenceDiagram
Alice->>John: Hello John, how are you?
```