다연이네

[days22] 컬렉션 클래스<List> - ArrayList와 Vector +열거자와 반복자 본문

Java

[days22] 컬렉션 클래스<List> - ArrayList와 Vector +열거자와 반복자

 다연  2020. 10. 21. 09:28
반응형

ArrayList

마치 배열처럼 사용하는 클래스

순서가 존재하고, 중복을 허용

데이터를 맨 뒤에 추가, 삭제하는 경우 성능이 좋다

[문제]

한 학생의 이,국,영,수,총,등 처리하는 2차원 또는 3차원 배열 수업 예제를 
     ArrayList 컬렉션 클래스 사용해서 30명의 학생의 성적 처리하세요.
       ㄱ. class Student {}  클래스 선언
       ㄴ. 팀원들 학생 추가
       ㄷ. 학생 검색 기능 추가
       ㄹ. 학생 수정
       ㅁ. 학생 삭제
       ㅂ. 모든 학생 정보  출력 ( iterator 반복자 사용 ) 
       ㅅ. 학생 정렬 ( 번호순 또는 이름순 또는 성적순 )
       ㅁ. 입력받은 학생수 출력

package review;

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

public class Review01 {

	public static void main(String[] args) {
		
		ArrayList list = new ArrayList(30);
		list.add(new Student(1, "스폰지밥", 67,34, 56, 157, 4, 52.33));
		list.add(new Student(2, "뚱이", 27,34, 56, 117, 5, 39.00));
		list.add(new Student(3, "징징이", 67,74, 56, 197, 1, 65.66));
		list.add(new Student(4, "집게사장", 30,20, 55, 105, 6, 35.00));
		list.add(new Student(5, "플랑크톤", 65,75, 55, 195, 2, 65.00));
		list.add(new Student(6, "다람이", 50,60, 70, 180, 4, 60.00));
		
		//입력받은 학생수 출력
		System.out.printf("> 학생수 %d명\n", list.size());
		
		//모든 학생 정보  출력
		printStudentList(list);
		
		//학생 검색 기능 추가
		System.out.println("> 검색할 학생명 ? ");
		String searchName = "황지혜"; //임의로 값 줬음
		ArrayList searchList = new ArrayList();
		
		for (int i = 0; i <list.size(); i++) {
			Student temp = (Student)list.get(i);
			if(temp.getName() == searchName) {
				searchList.add(temp);
				System.out.println(temp);
			}
		}
		if(searchList.isEmpty()) System.out.println("학생이 없습니다");
		
		//학생 수정
		list.set(1, new Student(2, "황지혜", 100,34, 56, 117, 1, 39.00));
		//학생 삭제
		list.remove(4);
		printStudentList(list);
	
		
		//Collections.sort(list); //오류, 기준을 잡아야 함
		
			 //Comparator 사용하기-1
	Comparator c = new StudentComparator();
		Collections.sort(list, c);
		//list.sort(c); 위와 동일한 코딩
		printStudentList(list);
		
	
		System.out.println("----------------");
			//Comparable 사용하기-2
		Collections.sort(list);
		printStudentList(list);
		
	}

	private static void printStudentList(List list) {
		Iterator ir =	list.iterator();
		while (ir.hasNext()) {
			Student s = (Student) ir.next();
			System.out.println(s);
		}
		
	}

	
	
}

class StudentComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		Student s1= (Student)o1;
		Student s2= (Student)o2;
	
		return s1.getTot()-s2.getTot(); //오름차순
	}
	
}
class Student implements Comparable{
	private int no;
	private String name;
	private int kor, eng, mat, tot, rank;
	private double avg;
	
	
	
	
	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

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

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMat() {
		return mat;
	}

	public void setMat(int mat) {
		this.mat = mat;
	}

	public int getTot() {
		return tot;
	}

	public void setTot(int tot) {
		this.tot = tot;
	}

	public int getRank() {
		return rank;
	}

	public void setRank(int rank) {
		this.rank = rank;
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	}

	public Student() {
		super();
	}

	public Student(int no, String name, int kor, int eng, int mat, int tot, int rank, double avg) {
		super();
		this.no = no;
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
		this.tot = tot;
		this.rank = rank;
		this.avg = avg;
	}

	@Override
	public String toString() {
		return String.format("[%d] %s\t%d\t%d\t%d\t%d\t%f\t%d", no, name, kor, eng, mat, tot, avg, rank);
	}

	@Override
	public int compareTo(Object o) {
		Student s = (Student)o;
		return this.getTot() - s.getTot();
	}
	
	
	
	
}

[문제] ArrayList list 객체에 임의의 정수( 1~100 ) 까지의 정수를 6개 입력하고 내림차순으로 정렬해서 출력하세요.

ArrayList<Integer> list = new ArrayList<>();
Random rnd = new Random(); //얘 안에 넣는거 무조건 안된다. 담배3사러가는데 3번 따로 가는 것 
	for (int i = 0; i <6; i++) {
		int data = rnd.nextInt(100)+1;
		list.add(data);
	}
System.out.println(list);
Collections.sort(list, new arrays());
System.out.println(list);

[문제] 게임횟수 입력받아서 로또 번호 발생 및 출력하고, 그 값을 복사해 다른 Array에 담기

ArrayList<HashSet<Integer>> lottosList = null;//초기화는 게임횟수 물어보고 받는다
//하나 발생한 hashset로또를 집어 넣을 어레이리스트
HashSet<Integer> lotto =null;//lottosList에 값을 넣기 위해 clear()안하려고 여기서 null
Random rnd = new Random();
try ( Scanner scanner = new Scanner(System.in);){
	System.out.print("> 게임 횟수를 입력하세요 ? ");
	int n = scanner.nextInt();
	          
	lottosList =new ArrayList<>(n); //여기서 초기화 값 받기
	          
	for (int i = 0; i <n; i++) {
	    lotto = new HashSet<Integer>(6);

	    System.out.printf("%d 게임 : ", i+1);
	     while (   lotto.size() != 6  ) {
	                lotto.add( rnd.nextInt(45)+1 );
	            }
	    System.out.println( lotto );
	    lottosList.add(lotto); //여기서 발생한 hashset로또  lottosList로 가져오기
	             //lotto.clear();
	}
	       
} catch (Exception e) {
	         e.printStackTrace();
	      }
		//다른컬렉션 값이 다른 컬렉션 안으로 들어갈 수 있다는 점 기억하기
	    //lottosList 출력하기
System.out.println("lottosList 출력하기");
Iterator<HashSet<Integer>> ir = lottosList.iterator();
 	while (ir.hasNext()) {
		HashSet<java.lang.Integer> set =  ir.next();
		System.out.println(set);
			
	}
}

 

 

Vector

ArrayList와 동일하나, 동기화 허용

xxxElement() 메소드 존재

package review;

import java.util.Enumeration;
import java.util.Vector;

public class Ex02 {

	public static void main(String[] args) {
		
		
		Vector<BoardVO> list = new Vector<>();
		//데이터 삽입
		list.addElement(new BoardVO("배다연", "2조~", "2조 content"));
		list.addElement(new BoardVO("김동준", "2조~", "2조 content"));
		list.addElement(new BoardVO("간장이", "2조~", "2조 content"));
		
		System.out.println(list.capacity()); //총공간 
		System.out.println(list.size()); //채워진공간
		list.trimToSize();
		System.out.println(list.size()); //빈공간 삭제

		System.out.println(list.firstElement()); //첫번째 요소를 얻어오는메소드
		System.out.println(list.get(0)); //위 코딩과 동일
		
		//데이터 특정 위치에 추가
		list.insertElementAt(new BoardVO("카라멜",  "1조~", "1조 content"), 1);
		System.out.println(list);
		
		//***열거자 (iterator : 반복자, 차이점은 fail-fast)
		Enumeration<BoardVO>  en = list.elements();
		while (en.hasMoreElements()) {
			BoardVO boardVO = (BoardVO) en.nextElement();
			System.out.println(boardVO);
			
		}
		
		
		
	}

}

//게시판 클래스
class BoardVO{ //보통 BoardDTO나 BoardVO라고 작성
	private String writer, subject, content;
	
	public BoardVO() {
		super();
	}
	
	public BoardVO(String writer, String subject, String content) {
		super();
		this.writer = writer;
		this.subject = subject;
		this.content = content;
	}

	@Override
	public String toString() {
		return String.format("%s \t %s \t %s ",  writer, subject, content);
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
	


	
}

열거자와 반복자

		//열거자, Enumeration 
Enumeration<BoardVO>  en = list.elements();
		while (en.hasMoreElements()) {
			BoardVO boardVO = en.nextElement();
			System.out.println(boardVO);
			
		}
        
        //반복자, Iterator
Iterator<Student> ir = list.iterator(); 
		while (ir.hasNext()) { 
			Student s = ir.next();
			System.out.println(s); 
		}

열거자와 반복자의 차이 : fail-fast


반복자 : 어떤 컬렉션 객체에서 반복자를 가져와 순차적으로 1개씩 접근해 출력하는 작업 1)2)3)
            => 도중에 그 컬렉션 클래스에 접근해 5번째 값을 삭제/삽입 등 수정해버리면 ? 바로 오류 (예외) 발생
열거자 : 중간에 추가 수정 삭제가 일어나더라도 그 작업을 끝까지 함 1)2)3)~10)

            => 제대로 된 것은 아니지만 상관없이 작업 끝냄
fail-fast = 중간에 수정이 발생하면 오류 띄우는 것

반응형
Comments