개발의 시작과 끝

2020.03.10 / Day - 26 자바 ArrayList 복습 본문

자바 복습

2020.03.10 / Day - 26 자바 ArrayList 복습

개발지혜 2020. 3. 10. 15:23

bbm - 13일차

 

ArrayList 예제 3 - 배열길이 자동증가 교체

class Main {
	public static void main(String[] args) {
		ArrayList ar = new ArrayList();
		ar.add(100);
		ar.add(200);
		ar.add(300);
		ar.add(400);
		
		int value = ar.get(0);
		System.out.println(value);
		// 출력 : 100
		
		value = ar.get(1);
		System.out.println(value);
		// 출력 : 200 
		
		value = ar.get(2);
		System.out.println(value);
		// 출력 : 300
		
		value = ar.get(3);
		System.out.println(value);
		// 출력 : 400
	}
}

class ArrayList {
	int[] datas;
	int lastIndex = -1;
	
	ArrayList() {
		datas = new int[3]; // 이 부분은 수정할 수 없습니다.
	}
	
	void add(int data) {
		lastIndex++;
		
        // 확장공사
		if(lastIndex >= datas.length) {
        
            // 늘어난 데이터를 새로 저장할 수 있는 공간을 생성함
			int[] newDatas = new int[datas.length * 2];
			
            // 새로만들어진 공간에 기존 데이터를 옮기는 작업
			for (int i = 0; i < datas.length; i++) {
				newDatas[i] = datas[i];
			}
			datas = newDatas;
		}
				
		datas[lastIndex] = data;
	}
	
	int get(int index) {
		return datas[index];
	}
}

ArrayList에서 데이터가 늘어났을 때 확장공사를 하는데

이는 증가된 데이터를 기존 데이터 공간을 버리고 새로운 데이터 공간을 만들어 교체하는 작업이다.

newData라는 새로운공간은 기존 datas보다 2배를 저장할 수 있다.

데이터 공간만 새로 만들면 기존에 저장되어 있던 데이터들이 모두 없어질 수있기 때문에  옮기는 작업을 해줘야 한다.

그러면 기존에 저장되어 있던 데이터들을 포함해 늘어난 데이터를 모두 새로운 공간인 newDatas에 저장할 수 있다.

 

 

ArrayList 예제 4 - size 함수

int size() {
  return lastIndex + 1;
}

size 함수는 add가 실행된 횟수이다.

 

 

ArrayList 예제 5 - remove 함수

ar.add(100);
ar.add(200);
ar.add(300);
ar.add(400);

ar.remove(2);
int value = ar.get(2);
System.out.println(value);
// 출력 : 400
		
ar.remove(0);
value = ar.get(0);
System.out.println(value);
// 출력 : 200


void remove(int index) {
  for ( int i = index; i < lastIndex; i++ ) {
    datas[i] = datas[i + 1];
  }
		
   lastIndex--;
}

ex)
100 200 300 400
0    1    2    3

remove 300
0    1    2     3
100  200  400   400 

remove 100
0    1    2    3
200  400  400  400 

remove 함수는 기존의 방에 있던 데이터를 지우는 함수이다. 

데이터를 지우게 되면 그 다음 방에 저장돼 있던 데이터들이 앞으로 하나씩 밀려오게 된다.

for ( int i = index; i < lastIndex; i++ ) {
    datas[i] = datas[i + 1];
}
lastIndex--;

 

 

 

ArrayList 예제 5 - addAt 함수

class Main {
	public static void main(String[] args) {
		ArrayList ar = new ArrayList();
		ar.add(100, 0);
		ar.add(200, 1);
		ar.add(300, 2);
		ar.add(400, 3);
		ar.add(500, 4);
		ar.add(600, 2); // 2번좌석으로 새치기, 기존의 2번좌석 손님부터 끝 손님까지 뒤로 한칸씩 밀린다.
		ar.add(700, 0); // 0번좌석으로 새치기, 기존의 0번좌석 손님부터 끝 손님까지 뒤로 한칸씩 밀린다.
		
		for ( int i = 0; i < ar.size(); i++ ) {
			int value = ar.get(i);
			
			System.out.println(i + " : " + value);
		}
		
		// 출력
		// 0 : 700
		// 1 : 100
		// 2 : 200
		// 3 : 600
		// 4 : 300
		// 5 : 400
		// 6 : 500
	}
}

class ArrayList {
	int[] datas;
	int lastIndex = -1;
	
	ArrayList() {
		datas = new int[3]; // 이 부분은 수정할 수 없습니다.
	}
	void add(int data, int index) {
		lastIndex++;
		
		if ( lastIndex >= datas.length ) {
			// 확장공사
			// 기존버스 버리고 새 버스로 연결!!
			// datas 이 녀석이 기존 버스를 버리고 새 버스를 가리켜야 합니다.
			
			// 새 버스 생성
			int[] newArr = new int[datas.length * 2];
			
			// 기존 버스(배열)를 버리기 전에 버스에 있던 승객들을 새 버스로 옮긴다.
			for ( int i = 0; i < datas.length; i++ ) {
				newArr[i] = datas[i];
			}
			datas = newArr;
			}
		for(int i = lastIndex; i > index; i--) {
			datas[i] = datas[i - 1];
		}
			
		
		datas[index] = data;
	}
		
	void add(int data) {
		lastIndex++;
		
		if ( lastIndex >= datas.length ) {
			// 확장공사
			// 기존버스 버리고 새 버스로 연결!!
			// datas 이 녀석이 기존 버스를 버리고 새 버스를 가리켜야 합니다.
			
			// 새 버스 생성
			int[] newArr = new int[datas.length * 2];
			
			// 기존 버스(배열)를 버리기 전에 버스에 있던 승객들을 새 버스로 옮긴다.
			for ( int i = 0; i < datas.length; i++ ) {
				newArr[i] = datas[i];
			}
			
			datas = newArr;
		}
		
		datas[lastIndex] = data;
	}
	
	int get(int index) {
		return datas[index];
	}
	
	int size() {
		return lastIndex + 1;
	}
}

기존 방 번호에서 새치기를 하여 방 번호를 바꾸는 것이다.

for ( int i = lastIndex; i > index; i-- ) {
    datas[i] = datas[i - 1];
}