2-1(2) List (인터페이스)

zhyun·2020년 9월 15일
0

HighJava

목록 보기
4/67
post-custom-banner

List (인터페이스)

  • 특징
    : 순서(인덱스)가 존재하는 데이터의 집합
    : 데이터가 중복되어도 저장이 가능하다 (순서가 다르면 중복저장 가능함)

List 를 구현하고 있는 클래스

  • Stack, Vector, LinkedList, ArryaList 등

List 정렬

  • 정렬과 관련된 interface는 Comparable과 Comparator 이렇게 두가지가 있다

Comparable => compareTo() 구현

  • 보통 객체 자체에 정렬기능을 넣기 위해서
  • int compareTo(T o) : 현재객체(this)와 대상객체(o)의 순서를 비교한다.
  • 결과값
    : 양수 (현재객체가 대상객체보다 순서값이 작은 경우)
    : 음수 (현재객체가 대상객체보다 순서값이 큰 경우)
    : 0 (현재객체가 대상객체보다 순서값이 동일한 경우)

Comparator => compare() 구현

  • 정렬기준을 별도로 구현하고 싶을 때
  • 정렬방식을 결정하는 class는 Comparator라는 인터페이스를 구현해야 한다.
  • 이 Comparator인터페이스의 compare()라는 메서드를 재정의 하여 구현하면 된다.
  • compare()메서드의 반환값을 결정하는 방법
    : 이 메서드가 양수를 반환하면 두 값의 순서가 바뀐다.(오름차순이 기본임)

  • 오름차순 정렬일 경우...
    : 앞의 값이 크면 양수, 같으면 0, 앞의 값이 작으면 음수를 반환하도록 한다.

  • String객체에는 정렬을 위해서 compareTo()메서드가 구현되어 있는데 이 메서드의 반환값은 오름차순에 맞게 반환되도록 구현되어 있다.
    (Wrapper클래스와 Date, File클래스에도 구현되어 있다.)

  • 정렬은 Collection.sort()메서드를 이용하여 정렬한다

(ex)

class Desc implements Comparator<String>{ //Comparator<String> 을 꼭 implements 해야한다.
	@Override
	public int compare(String str1, String str2) { 
		return str1.compareTo(str2) * 1; // 기본적으로 오름차순(양수)으로 구현되어 있다
//		return str1.compareTo(str2) * -1;// 내림차순 (음수)
	}
}

public class T02_ListSortTest {//20.09.14
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("일지매"); //Comparable -> compareTo()구현되어 있음  
		list.add("홍길동"); 
		list.add("성춘향");
		list.add("변학도");
		list.add("이순신");
		
		System.out.println("1. 정렬 전 : "+list); // [일지매, 홍길동, 성춘향, 변학도, 이순신]
		//정렬은 Collection.sort()메서드를 이용하여 정렬한다.
		//기본적으로 '오름차순 정렬'을 수행한다.
		
		//정렬방식을 변경하려면 정렬방식을 결정하는 객체를 만들어서
		//Collection.sort()메서드에 변수로 넘겨주면 된다.
		Collections.sort(list); // 오름차순으로 정렬하기
		System.out.println("2. 정렬 후 :" + list); //[변학도, 성춘향, 이순신, 일지매, 홍길동]
		
		Collections.shuffle(list); // 데이터를 섞어준다.
		System.out.println("자료 섞기 후 : "+ list);
		
		//정렬방식을 결정하는 객체(정렬자)를 이용하여 정렬하기
		Collections.sort(list, new Desc());
		System.out.println("정렬 후 :" + list); // 오름차순
	}
}

(ex2)

/**
 * 회원의 정보를 저장할 클래스
 * (회원이름을 기준으로 오름차순 정렬이 될 수 있는 클래스 만들기) 
 */
class Member implements Comparable<Member>{
	private int num; // 번호
	private String name; //이름
	private String te1;
    
    @Override
	public String toString() {
		return "Member [num=" + num + ", name=" + name + ", te1=" + te1 + "]";
	}
/**
 * 이름을 기준으로 오름차순 정렬이 되도록 설정한다.
 */
	@Override
	public int compareTo(Member mem) { 
		return getName().compareTo(mem.getName());
	}
}

/**
 * 정렬 기준의 외부 선언을 위해서는 Comparator인터페이스를 구현하면 된다. 
 * (Member객체의 번호(num)의 내림차순으로 정렬하기)
 */
class SortNumDesc implements Comparator<Member>{ //외부 정렬 기준을 이용한 정렬하기 클래스

	@Override
	public int compare(Member mem1, Member mem2) {
		/*
		if(mem1.getNum() > mem2.getNum()) { // 내림차순 -> 음수 리턴;
			return -1; // 음수 리턴;
		}else if(mem1.getNum() == mem2.getNum()) {
			return 0;
		}
		return 1; // 위가 모두 아닐때 양수 리턴; 
	}*/
	// Wrapper클래스에서 제공하는 메서드를 이용하는 방법1
	/*return Integer
	 * 		.compare(mem1.getNum(), mem2.getNum()) * -1;
	 */
	
    // Wrapper클래스에서 제공하는 메서드를 이용하는 방법2
	return new Integer(mem1.getNum())
			.compareTo(mem2.getNum()) * -1;	
	}	
	
}

public class T03_ListSrotTest { // 20200914
	public static void main(String[] args) {
		
		List<Member> memList = new ArrayList<Member>();
		
		memList.add(new Member(1, "홍길동", "010-1111-1111"));
		memList.add(new Member(5, "변학도", "010-2222-2222"));
		memList.add(new Member(9, "성춘향", "010-3333-3333"));
		memList.add(new Member(3, "이순신", "010-4444-4444"));
		memList.add(new Member(6, "강감찬", "010-5555-5555"));
		memList.add(new Member(2, "일지매", "010-6666-6666"));
		
		System.out.println("정렬전 : " );
		for(Member mem : memList) {
			System.out.println(mem);
		}
		System.out.println("------------------------------------");
		
		Collections.sort(memList); // 정렬하기
		
		System.out.println("이름의 오름차순으로 정렬 후:");
		for(Member mem : memList) {
			System.out.println(mem);
		}
		System.out.println("--------------------------------");
		
		//외부 정렬 기준을 이용한 정렬하기
		Collections.sort(memList, new SortNumDesc());
		
		System.out.println("번호의 내림차순으로 정렬 후:");
		for(Member mem : memList) {
			System.out.println(mem);
		}
	}
}

profile
HI :)
post-custom-banner

0개의 댓글