230310 열 일곱 번째 수업_Java

mary·2023년 3월 10일
0

국비 수업

목록 보기
17/72

~컬렉션 프레임워크(Collection Framework) 중~

LinkedList :

배열의 단점을 보완함

데이터를 추가하려면 노드(객체)를 새로 생성하여 앞 뒤로 연결한 링크 필드를 연결시켜 데이터의 추가/삭제를 유리하게 함.

package collection.linkedList01;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class LikedList2 {
	public static void main(String[] args) {
		ArrayList a = new ArrayList(1100000);
		LinkedList l = new LinkedList();
		System.out.println("순차적 추가할 때 걸린 시간");
		System.out.println("ArrayList : " + add(a));
		System.out.println("LikedList : " + add(l));
		
		System.out.println("중간에 추가할 때 걸린 시간");
		System.out.println("ArrayList : " + addM(a));
		System.out.println("LikedList : " + addM(l));
		
		System.out.println("중간 삭제할 때 걸린 시간");
		System.out.println("ArrayList : " + removeM(a));
		System.out.println("LikedList : " + removeM(l));
		
		System.out.println("끝에서부터 모두 삭제할 때 걸린 시간");
		System.out.println("ArrayList : " + removeE(a));
		System.out.println("LikedList : " + removeE(l));
	}
	
	// 각각 몇 초 걸리는지 보려고
	static long add(List list) { //둘 다 부모가 List라 둘 다 받을 수 있음
		long start = System.currentTimeMillis();
		for(int i=0; i<1000000; i++) {
			list.add(i + " ");
		}
		long end = System.currentTimeMillis();
		return end-start;
	}
	
	static long addM(List list) {
		long start = System.currentTimeMillis();
		for(int i=0; i<10000; i++) {
			list.add(5000 , "m"); //5000번째에 m 데이터 추가
		}
		long end = System.currentTimeMillis();
		return end-start;
	}
	//중간 삭제
	static long removeM(List list) {
		long start = System.currentTimeMillis();
		for(int i=0; i<10000; i++) {
			list.remove(i); 
		//삭제 후에 데이터들이 앞으로 땡겨오고 i가 그 다음번째를 삭제하므로 중간 삭제
		}
		long end = System.currentTimeMillis();
		return end-start;
	}
	//끝부터 삭제
	static long removeE(List list) {
		long start = System.currentTimeMillis();
		for(int i=list.size()-1; i>=0; i--) { //size면 인덱스번호 0부터 시작이니까 -1
			list.remove(i);
		}
		long end = System.currentTimeMillis();
		return end-start;
	}
}
=>
순차적 추가할 때 걸린 시간
ArrayList : 106
LikedList : 179
중간에 추가할 때 걸린 시간
ArrayList : 1933
LikedList : 177
중간 삭제할 때 걸린 시간
ArrayList : 1272
LikedList : 193
끝에서부터 모두 삭제할 때 걸린 시간
ArrayList : 8
LikedList : 31

ArrayList는 시간이 많이 걸림
likedList는 시간이 비슷비슷하게 걸림


set

set에서는 컴퓨터 마음대로 순서를 배정하기 때문에
인덱스를 사용하지 못해서 무슨 값이 먼저 나올지 모름
그래서 미리 만들어놓은 반복자 리턴 클래스를 이용함

Iterator:

모든 컬렉션 프레임워크에서 값을 가져오거나 삭제할 때 씀
3개의 메소드만 알고 사용하면 이용하기 쉬움

  • Iterator.hasNext():
    iterator 안에 값이 들어있는지 true, false

  • Iterator.next():
    iterator의 다음 값 가져오기

  • Iterator.remove():
    iterator에서 next()시에 가져왔던 값을 컬렉션(List, Set, Map)에서 삭제
    반드시 next() 후에 사용해야 함


HashSet

package collection.hashSet02;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

class Member {
	public String name; //equals 오버라이딩에서 name을 가져오려면 public
	public int age;
	public Member(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	//equals는 원래 주소가 같은가 보는 거라서 값을 보기위해 오버라이딩함
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Member) {
			Member member = (Member)obj;
			return member.name.equals(name) && member.age == age;
		}
		return false; //if값이 참이 아니면 false
	}
	//주소를 같게 만들어주는 오버라이딩
	@Override
	public int hashCode() {
		return name.hashCode() + age; 
		//이름과 나이가 같으면 해시코드를 같게 하라
	}
	@Override
	public String toString() {
		return "Member [name=" + name + ", age=" + age + "]";
	}
}
public class HashSet4 {
	public static void main(String[] args) {
		Set<Member> set = new HashSet<Member>();
		
		//값이 같으니 size 개수가 1개로 나오도록 하기(주소는 다른 객체들임)
		set.add(new Member("홍길동", 20));
		set.add(new Member("홍길동", 20));
		
		System.out.println("size: " + set.size());
		iteratorPrint(set.iterator());
		System.out.println();
	}
	
	static void iteratorPrint(Iterator<Member> i) {
		while(i.hasNext()) {
			Member p = i.next(); 
			System.out.print(p.name + ", "); 
			System.out.print(p.age + "\t");
		}	
		System.out.println();
	}
}
=>
size: 1
홍길동, 20	

*연습문제*
//Set으로 복권 중복없이 뽑기

package collection.hashSet02;

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class HashSet5 {
	public static void main(String[] args) {
		Set<Integer> set = new HashSet<Integer>();
		while(set.size() < 6) {
			set.add((int)(Math.random()*45)+1);
		}
		List list = new LinkedList(set);
		Collections.sort(list); //정렬하는 메소드
		System.out.println(list);
		
		Set<Integer> set2 = new HashSet<Integer>();
		for(int i=0; set2.size() < 6; i++) {
			set2.add((int)(Math.random()*45)+1);
		}
		List list2 = new LinkedList(set2);
		Collections.sort(list2); 
		System.out.println(list2);
	}
}

TreeSet:

package collection.treeSet03;

import java.util.Set;
import java.util.TreeSet;

public class TreeSet2 {
	public static void main(String[] args) {
		//복권 만들기 TreeSet으로 간단하게 가능
		Set set = new TreeSet();
		
		while(set.size() < 6) {
			set.add((int)(Math.random()*45)+1);
		}
		System.out.println(set);
	}
}


정렬 출력하기

package collection.treeSet03;

import java.util.NavigableSet;
import java.util.Set;
import java.util.TreeSet;

public class TreeSet3 {
	public static void main(String[] args) {
		Object[] arr = {1,2,3,4,5,6,7,8,9,1,2,3,4};
		Set set = new TreeSet();
		for(Object i : arr)
			set.add(i);
		
		System.out.println(set); //오름차순 정렬
		
		//내림차순 정렬
		NavigableSet<Integer> desending = ((TreeSet<Integer>)set).descendingSet();
		/*
		for(Integer i : desending) {
			System.out.println(i + " ");
		}
		*/
		System.out.println(desending);
	} 
}
profile
내 인생을 망치러 온 나의 구원, 개발

0개의 댓글