List Interface 특징

  • Stack과 Queue는 LinkedList를 이용하여 사용할 수 있다.

Stack

  • 선입후출(FILO)의 자료구조

명령

  • 자료 입력 : push(저장할 값)
  • 자료 출력 : pop() => 자료를 꺼내온 후 꺼내온 자료를 stack에서 삭제한다.
LinkedList<String> stack = new LinkedList<>();
stack.push("갓김치");
stack.push("이듀듀");
stack.push("김추추");
stack.push("김호근");
System.out.println("현재 stack값들 : " + stack);
		
String data = stack.pop();
System.out.println("꺼내온 자료 : " + data); //제일 나중에 넣은 값이 먼저 나옴
System.out.println("꺼내온 자료 : " + stack.pop());
System.out.println("현재 stack값들 : " + stack);
		
stack.push("담임땜");
System.out.println("현재 stack값들 : " + stack);
System.out.println("꺼내온 자료 : " + stack.pop());

Queue

  • 선입선출(FIFO)의 자료구조

명령

  • 자료 입력 : offer(저장할 값)
  • 자료 출력 : poll() => 자료를 Queue에서 꺼내온 후 꺼내온 자료는 Queue에서 삭제한다.
//LinkedList로 Queue 구현하기
LinkedList<String> queue = new LinkedList<>();
queue.offer("갓김치");
queue.offer("이듀듀");
queue.offer("김추추");
queue.offer("김호근");

System.out.println("현재 queue의 값 : " + queue);

String temp = queue.poll();
System.out.println("꺼내온 자료 :" + temp);
System.out.println("꺼내온 자료 :" + queue.poll());
System.out.println("현재 queue의 값 : " + queue);

if(queue.offer("담임땜")) {
	System.out.println("신규 등록 자료 : 담임땜");
}
System.out.println("현재 queue의 값 :" + queue);
System.out.println("꺼내온 자료 : " + queue.poll());

참고

  • T01_StackQueueTest.java

List 정렬

  • 정렬과 관련된 interface: Comparable, Comparator

Comparator

  • 정렬기준을 별도로 구현하고 싶을 때
  • compare()메서드를 구현해야함

compare()메서드

  • 반환값을 결정하는 방법
    • 메서드가 양수를 반환하면 두 값의 순서가 바뀐다 (기본: 오름차순)
    • 앞의 값이 크면 양수, 같으면 0, 앞의 값이 작으면 음수를 반환
  • String 객체에는 정렬을 위해서 compareTo()메서드가 구현되어 있음
    • 이 메서드의 반환값은 오름차순에 맞게 반환되도록 구현되어 있다.
    • Wrapper클래스와 Date, File클래스에도 구현되어 있다.
class Desc implements Compataor<String> {
    @Override
    public int compare(String str1, String str2) {
        return str1.compareTo(str2) * -1; // 내림차순
    }
}
  • 정렬 전: [일지매, 홍길동, 성춘향, 변학도, 이순신]
// 기본 오름차순
Collections.sort(list);

//정렬 후 : [변학도, 성춘향, 이순신, 일지매, 홍길동]

// 정렬방식을 결정하는 객체(정렬자)를 이용하여 정렬하기 - 내림차순
Collections.sort(list, new Desc());

// 정렬 후 : [홍길동, 일지매, 이순신, 성춘향, 변학도]

Comparable

  • 보통 객체 자체에 정렬기능을 넣기위해
  • compareTo()메서드를 구현해야함
// 회원 정보를 저장할 클래스
// 회원 이름을 기준으로 오름차순 정렬이 될 수 있는 클래스
class Member implements Comparable<Member> {
    private int num;
    private String name;
    private String tel;
    
    // 필드값 이용한 생성자 
    // 필드값 이용한 getter, setter\
    
    // 이름 기준으로 오름차순이 되도록 정렬
    @Override
    public int compareTo(Member m) {
        return getName().compareTo(m.getName());
    }
}

// 정렬 기준의 외부 선언을 위해서는 Comparator 인터페이스를 구현
// Member 객체의 번호(num)의 내림차순으로 정렬
class SortNumDesc implements Comparator<Member> {
    @Override
    public int compare(Member m1, Member m2) {
        // 1. 직접 로직 만드는 방법
        if(m1.getNum() > m2.getNum()) {
            return -1;
        }else if(m1.getNum() == m2.getNum()) {
            return 0;
        }else {
            return 1;
        }
        
        // 2. wrapper 클래스에서 제공하는 메서드를 활용하는 방법
        // Integer의 static method 이용
        return Integer.compare(m1.getNum(), m2.getNum()) * -1;
        
        // 3. wrapper 클래스에서 제공하는 메서드를 활용하는 방법2
        return new Integer(m1.getNum()).compareTo(m2.getNum()) * -1;
    }
}

////// main()
// memList 라는 list객체에 Member정보가 이미 저장되어 있음
// 1. Member 클래스 이용해 이름순 오름차순
Collections.sort(memList);

// 2. 외부 정렬 기준을 이용해 정렬
Collections.sort(memList, new SortNumDesc());

참고

  • T02_ListSortTest.java : Comparator 관련
  • T03_ListSortTest.java

문제

  • 학번, 이름, 국어점수, 영어점수, 수학점수, 총점, 등수를 멤버로 갖는 Student 클래스를 만든다.
  • 생성자는 학번, 이름, 국어, 영어, 수학 점수만 매개 변수를 받아서 처리한다.
  • 이 Student객체들은 List에 저장하여 관리한다.
  • List에 저장한 데이터들을 학번의 오름차순으로 정렬하여 출력하는 부분과 총점의 역순으로 정렬하는 부분을 프로그램 하시오.
    • 총점이 같으면 학번의 내림차순으로 정렬되도록 한다.
    • 학번 정렬 기준은 Student클래스 자체에서 제공하도록 하고, 총점 정렬 기준은 외부클래스에서 제공하도록 한다.
// 학번 오름차순 정렬
class Student implements Comparable<Student>{
    @Override
    public int compareTo(Student student){
        return getId().compareTo(student.getId());
    }
}
// 총점 내림차순 정렬 (동점일 경우 학번 내림차순 정렬)
class SortTotalDesc implements Comparator<Student>{
    @Override
    public int compare(Student s1, Student s2){
        if(s1.getTotal() > s2.getTotal(){
            return -1;
        }else if(s1.getTotal() == s2.getTotal()){
            return s1.getId().compareTo(S2.getId()) * -1;
        }else{
            return 1;
        }
    }
}

참고

  • T04_StudentTest.java
profile
갈 길이 멀다

0개의 댓글