[JAVA] Data Structure

GONG PYUNG·2022년 5월 18일
0
post-thumbnail

1. List

1.1 특징

  • 데이터를 순차적으로 처리하는 구조
  • List에 데이터를 추가하는 순서대로 인덱스 번호가 매겨짐
  • 데이터의 중복을 허용
  • 배열과 매우 유사한 구조를 갖고 있음
  • 정렬 기능

1.2 Sample Code

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;

public class List_Sample {

	public static void main(String[] args) throws Exception {
		ArrayList<String> al = new ArrayList<String>();
		
		// 데이터 입력
		al.add("Michael Knight");
		al.add("Mac Guyver");
		al.add("Clark Kent");
		al.add("Bruce Wayne");
		al.add("Tony Stark");
		
		// 출력(방식 1)
		for (String name : al) System.out.println(name);
		System.out.println();
		// 데이터 삭제
		al.remove("Clark Kent");
		// 출력(방식 2)
		for (int i=0; i<al.size(); i++) System.out.println(al.get(i));
		System.out.println();
		
		al.remove(0);
		// 출력(방식 3)
		Iterator<String> itr = al.iterator();
		while(itr.hasNext()) System.out.println(itr.next());
		System.out.println();
		
		// 정렬 (오름차순)
		Collections.sort(al);
		
		for (String name : al) System.out.println(name);
		System.out.println();
		
		// 정렬 Comparator
		Comparator<String> co = new Comparator<String>() {
			public int compare(String o1, String o2) {
				return (o2.compareTo(o1)); // 내림차순
			}
		};
		// 정렬 Comparator 사용
		Collections.sort(al, co);
		
		for (String name : al) System.out.println(name);
		System.out.println();
		
		// 정렬 (람다식 사용)
		Collections.sort(al, (g1, g2) -> g1.compareTo(g2));
		for (String name : al) System.out.println(name);
		System.out.println();
				
	}
}

1.3 실습

List_Sample.txt에는 학생들의 성적 데이터가 저장되어 있다.
1. Console화면에서 'PRINT'를 입력하면 이름 순(오름차순)으로 출력하시오.
2. Console화면에서 'KOREAN', 'ENGLISH', 'MATH'를 입력하면 해당 과목 성적 순(내림차순)으로 출력해 보시오.
(성적이 동일할 경우에는 이름을 오름차순으로 정렬)
3. 'QUIT'을 입력하면 프로그램을 종료하시오.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class List_Practice {

	public static void main(String[] args) throws IOException {

		String line;
		FileReader fr = new FileReader("./INPUT/List_Sample.txt");
		BufferedReader br = new BufferedReader(fr);

		ArrayList<Grade> al = new ArrayList<Grade>();
		Grade g;

		while ((line = br.readLine()) != null) {
			String[] arr = line.split("\t");
			g = new Grade(arr[0], Integer.parseInt(arr[1]), Integer.parseInt(arr[2]), Integer.parseInt(arr[3]));
			al.add(g);
		}
		
		br.close();
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		while (true) {
			String input = in.readLine();
			
			switch(input) {
			
			case "PRINT" :
				Collections.sort(al, (g1, g2) -> g1.getName().compareTo(g2.getName()));
				break;
				
			case "KOREAN" :
				Collections.sort(al, (g1, g2) -> (g2.getKorean() - g1.getKorean()) == 0 ? g1.getName().compareTo(g2.getName()) : g2.getKorean() - g1.getKorean());
				break;
				
			case "ENGLISH" :
				Collections.sort(al, (g1, g2) -> (g2.getEnglish() - g1.getEnglish()) == 0 ? g1.getName().compareTo(g2.getName()) : g2.getEnglish() - g1.getEnglish());
				break;
				
			case "MATH" :
				Collections.sort(al, (g1, g2) -> (g2.getMath() - g1.getMath()) == 0 ? g1.getName().compareTo(g2.getName()) : g2.getMath() - g1.getMath());
				break;
				
			case "QUIT" :
				return;
				
			default :
				continue;
				
			}
			
			for (Grade out : al) System.out.println(String.format("%s\t%d\t%d\t%d", out.getName(), out.getKorean(), out.getEnglish(), out.getMath())); 
		}
	}
}

class Grade {

	private String name;
	private int korean;
	private int english;
	private int math;

	public Grade(String name, int korean, int english, int math) {
		super();
		this.name = name;
		this.korean = korean;
		this.english = english;
		this.math = math;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKorean() {
		return korean;
	}

	public void setKorean(int korean) {
		this.korean = korean;
	}

	public int getEnglish() {
		return english;
	}

	public void setEnglish(int english) {
		this.english = english;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

}

2. Map

2.1 특징

  • 저장되는 순서가 유지되지 않는 구조
  • 키(key)와 값(value)의 쌍으로 저장 (키와 값 모두 객체)
  • 키(key)의 중복을 허용하지 않음
  • 키(key)를 이용하여 각 값(value)을 구별할 수 있음

2.2 Sample Code

import java.util.HashMap;

public class Map_Sample {

	public static void main(String[] args) {
		// HashMap 인스턴스 생성
		HashMap<String, String> m = new HashMap<String, String>();
		// 데이터 입력
		m.put("kit@gmail.com", "Michael Knight");
		m.put("knife@gmail.com", "Mac Guyver");
		m.put("superman@gmail.com", "Clark Kent");
		m.put("batman@gmail.com", "Bruce Wayne");
		m.put("ironman@gmail.com", "Tony Stark");
		// 출력
		for (String key : m.keySet()) System.out.println(key + " : " + m.get(key));
		System.out.println();
		// 데이터 삭제
		m.remove("superman@gmail.com");
		
		for (String key : m.keySet()) System.out.println(key + " : " + m.get(key));
		System.out.println();
		// 데이터(Value) 변경
		m.replace("batman@gmail.com", "Robin");
		for (String key : m.keySet()) System.out.println(key + " : " + m.get(key));
	}
}

3. Queue

3.1 특징

  • 먼저 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식
  • front는 삭제 연산만 수행함
  • rear는 삽입 연산만 수행함
  • 그래프의 넓이 우선 탐색(BFS)에서 사용

3.2 Sample Code

import java.util.LinkedList;
import java.util.Queue;

public class Queue_Sample {

	public static void main(String[] args) {
		Queue<String> q = new LinkedList<>();
		
		q.add("one");
		q.add("two");
		q.add("three");
		
		System.out.println("Queue Count = " + q.size());
		
		for (String number : q) System.out.println(number);
		
		System.out.println("Deque : " + q.poll());
		System.out.println("Peek : " + q.peek());
		System.out.println("Contains(\"three\") : " +q.contains("three"));
		
		q.clear();
		System.out.println("Queue Cont = " + q.size());
	}
}

3.3 실습

입력 메세지(문자열)를 저장하는 Queue들을 작성하시오.
Console로 입력되는 다음 명령어들을 처리해야 함

  • CREATE (Queue Name) (Queue Size)
    : Queue Name으로 Queue를 생성, 정상 생성 시 "Queue Created" 출력
    : Queue Name의 Queue가 이미 존재하는 경우 "Queue Exist" 출력
  • ENQUEUE (Queue Name) (Message)
    : Queue Name의 Queue에 Message 저장, 저장 시 고유 Id값을 생성하여 함께 저장
    : Queue Size개의 데이터가 이미 저장된 경우 "Queue Full" 출력, 정상인 경우 "Enqueued" 출력
  • DEQUEUE (Queue Name)
    : Queue Name의 Queue에 가장 먼저 저장된 Message와 Message Id를 출력하고, 해당 메세지 삭제
    : Queue가 비어 있다면 "Queue Empty" 출력
  • Get (Queue Name)
    : Queue Name의 Queue에 가장 먼저 저장된 Message와 Message Id를 출력
    : 해당 Message는 Queue에서 삭제되지 않지만, 다시 GET할 수는 없음
  • SET (Queue Name) (Message Id)
    : Queue Name과 Message Id에 해당하는 Message를 다시 GET할 수 있게 세팅
    : 세팅 성공 시 "Msg Set", 실패 시 "Set Fail" 출력
  • DEL (Queue Name) (Message Id)
    : Queue에서 Message Id에 해당하는 Message 삭제, 삭제 성공 시 "Deleted" 출력
    : 삭제 실패 시 "Not Deleted" 출력

소스 : https://github.com/gongpyung/sysol/blob/master/src/DataStructure/Queue_Practice.java


profile
주니어 개발자 공평

0개의 댓글