Collection Framework : 여러 개의 데이터를 다루는 데 표준화된 방식을 자바에서 제공해줌.
Collection Framework에는 3종류가 있음.
List , Map , Set
List - 배열, 타입이 다른 객체들을 저장할 수 있고 처음에 크기를 지정하지 않아도 됨.
크기가 유동적으로 조정됨.
Map - 내가 가지고 있는 key로 값을 저장.
Set - 중복된 값이 저장되지 않음.
[ArrayList] 클래스의 메서드들
boolean add(Object obj) : 마지막 위치에 객체를 추가 후 성공여부를 반환한다.
void add(int index, Object obj) : 지정된 위치에 객체를 추가한다.
-인덱스 지정, 지정한 인덱스에 값을 추가
Object set(int index, Object obj) : 지정된 위치에 객체를 저장 후 기존 객체를 반환한다. -수정하는 메서드
Object get(int index) : 지정된 위치의 객체를 반환한다. -인덱스에 있는 값을 얻을 수 있는 메서드
int size() : 저장된 객체의 수를 반환한다. -저장된 값의 개수
Object remove(int index) : 지정된 위치의 객체를 제거한다. -저장된 값을 제거하기 위한 메서드
ArrayList sample = new ArrayList();//제네릭을 지정하지 않으면 타입 상관없음
//타입에 구애없이 저장은 쉽지만 꺼낼 때 자료의 타입이 예측이 되지 않음.
sample.add("abc");
sample.add(100);
sample.add(new Scanner(System.in));
타입 : 클래스
byte : Byte
short : Short
int : Integer
long : Long
float : Float
double : Double
char : Character
boolean : Boolean
클래스와 타입 간 자동형변환 가능
ArrayList<Integer> list = new ArrayList<Integer>();
<>:제네릭, <>안에 내가 저장하고싶은 타입의 데이터(클래스명)를 입력
컬렉션에는 기본형타입을 저장할 수 없음, 객체만 저장할 수 있음.
-> 클래스여야하기 때문에 기본형 int타입을 대체하는 클래스 Integer라고 써줌
list.add(10);
list.add("abc"); 제네릭 외의 타입을 저장했기 때문
list.add(new Integer(20)); //클래스와 타입 간에 자동형변환 가능
System.out.println(list.add(30));//30을 저장한 다음,
return되는 값을 성공적으로 저장했을 때 true, 안되면 false
System.out.println(list);
list.add(1, 40);//1번 인덱스에 40을 넣고 나머지 인덱스를 뒤로 민다.
->기존에 저장되어 있던 인덱스 내에서만 저장 가능.
System.out.println(list);
Integer before = list.set(2, 50);//2번 인덱스의 값을 50으로 바꾼다.
System.out.println(before);//기존의 값을 반환
System.out.println(list);//새로들어온 값
int get = list.get(2);//Integer타입 뿐 아니라 int타입의 변수도 만들 수 있음.
-> 자동형변환이 되기때문. 보통 int타입을 주로 씀.
System.out.println(get);
ArrayList 안에 있는 데이터들을 삭제하고 싶을 때
for(int i = 0; i < list.size(); i++) {//삭제되면서 size가 줄어듦. -> 2번 돌고 끝남.
System.out.println(i + " : " + list.get(i));//출력
list.remove(i);//삭제 - 길이가 줄어듦
값을 제거할 때는 뒤에서부터 제거해야 한다.
for(int i = list.size() - 1; i >= 0; i--) {
System.out.println(i + " : " + list.remove(i));
}
System.out.println(list);
//list에 1~100사이의 랜덤값을 10개 저장해주세요.
for(int i = 0; i < 10; i++) {
list.add((int)(Math.random() * 100) + 1); //랜덤값 복습, round메서드 복습
}
System.out.println(list);
//list의 저장된 값의 합계와 평균을 구해주세요.
int sum = 0;
double avg = 0;
for(int i = 0; i < list.size(); i++) {
sum += list.get(i);
}
avg = (double)sum / list.size();
System.out.println("sum : " + sum + " / avg : " + avg);
//list에서 최소값과 최대값을 구해주세요.
int min = list.get(0);
int max = list.get(0);
for(int i = 0; i < list.size(); i++) {
if(list.get(i) < min) {
min = list.get(i);
}
if(list.get(i) > max) {
max = list.get(i);
}
}
System.out.println("min : " + min + " / max : " + max);
//list를 오름차순으로 정렬해주세요.
for(int i = 0; i < list.size(); i++) {
for(int j = i + 1; j < list.size(); j++) {
if(list.get(j) < list.get(i)) {
int temp = 0;
temp = list.get(j);
list.set(j,list.get(i));
list.set(i,temp);
}
}
}
System.out.println(list);
//선생님답
for(int i = 0; i < list.size() - 1; i++) {
min = i;
for(int j = i + 1; j <list.size(); j++) {
if(list.get(j) < list.get(min)) {
min = j;
}
}
int temp = list.get(i);
list.set(i,list.get(min));//대입연산자의 왼쪽은 반드시 변수여야 함.
list.set(min, temp);
}
System.out.println(list);
//2차원
ArrayList<ArrayList<Integer>> list2 = new ArrayList<ArrayList<Integer>>();
list = new ArrayList<Integer>();
list.add(10);
list.add(20);
list.add(30);
list2.add(list);
System.out.println(list2);
list = new ArrayList<Integer>();
list.add(40);
list.add(50);
list2.add(list);
System.out.println(list2);
list.get(0);
list2.get(0).get(0); //arr[0][0]
for(int i = 0; i < list2.size(); i++) {
ArrayList<Integer> al = list2.get(i);
for(int j = 0; j < al.size(); j++) {
System.out.println(al.get(j));
}
}
//3명의 학생이 5과목을 봤을 때 2차원으로 각각 저장, 합계, 평균
//학생 3명의 5과목에 대한 0~100점의 랜덤한 점수를 2차원 ArrayList에 저장해주세요.
ArrayList<ArrayList<Integer>> scores = new ArrayList<ArrayList<Integer>>();
for(int i = 0; i < 3; i++) {
ArrayList<Integer> score = new ArrayList<Integer>();
for(int j = 0; j < 5; j++) {
score.add((int)(Math.random() * 101));
score.add((int)(Math.random() * 101));
score.add((int)(Math.random() * 101));
score.add((int)(Math.random() * 101));
score.add((int)(Math.random() * 101));
}
scores.add(score);
}
System.out.println(scores);
//합계, 평균구하기
ArrayList<Integer> sums = new ArrayList<Integer>();
ArrayList<Double> avgs = new ArrayList<Double>();
for(int i = 0; i < scores.size(); i++) {
ArrayList<Integer> score = scores.get(i);
sum = 0;
//sum1의 첫번째 학생의 합을 넣기
for(int j = 0; j < scores.get(i).size(); j++) {
sum += scores.get(i).get(j);
}
sums.add(sum);
avgs.add((double)sum / score.size());
}
System.out.println(sums);
System.out.println(avgs);