자바 패키지 배열 의 동적 배열 실현 방법 에 대한 상세 한 설명
앞에서 말 했 듯 이 그 전에 우리 가 봉 인 된 배열 은 정적 배열,즉 배열 공간 고정 길이 에 속 했 고 고정 길이 의 배열 은 요소 가 용량 을 초과 할 때 배열 공간 이 부족 하 다 고 보고 했다.수 조 를 더욱 잘 사용 하기 위해 서,우 리 는 자동 으로 용량 을 늘 릴 수 있 는 수 조 를 실현 한다.
실현 방향:
1.배열 의 용량 이 사전 정의 값 에 이 르 렀 을 때 data 배열 의 두 배 인 new Data 배열(확장)을 만 듭 니 다.
2.data 배열 의 요 소 를 모두 new Data 배열 에 할당 합 니 다.
3.data 배열 을 new Data 배열 로 다시 실행 합 니 다.
1.핵심 확장 방법 정의
//
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
2.개 선 된 배열 에 요 소 를 추가 하 는 방법(배열 공간 이 부족 할 때 자동 확장-원리 공간의 2 배)
// index
public void add(int index, E e) {
//(1) , (3),
if (index < 0 || index > size)
throw new IllegalArgumentException(" ");
//(2) ,
if (size == data.length)
resize(data.length * 2);
// index
for (int i = size - 1; i >= index; i--) {
//(3) index , index
data[i + 1] = data[i];
}
data[index] = e;
//(4) size
size++;
}
3.이전 배열 에서 요 소 를 삭제 하 는 방법 을 개선 합 니 다.(배열 공간 이 너무 비어 있 으 면 줄 어 듭 니 다.(원래 공간의 1/2)
// index ,
public E remove(int index) {
//1.
if (index < 0 || index > size)
throw new IllegalArgumentException(" ");
//2.
E ret = data[index];
// index (index)
for (int i = index + 1; i < size; i++) {
//3. -- index (index) ,
data[i - 1] = data[i];
}
//4. size
size--;
// loitering objects != memory leak
data[size] = null;
if (size == data.length / 2) {
resize(data.length / 2);
}
//5.
return ret;
}
이상 을 통 해 우 리 는 동태 적 인 배열 을 실현 할 수 있다.개 선 된 코드 테스트:
1.addLast 테스트()
DynamicArray<Integer> arr=new DynamicArray<Integer>(10);
for (int i = 0; i < 10; i++) {
arr.addLast(i);
}
System.out.println(" :");
System.out.println(arr);
결 과 는:2.add(int index,E e)방법 테스트
arr.add(1, 100);
System.out.println(" e:");
System.out.println(arr);
결과:현재 배열 은 방금 정 의 된 용량 10 개 에서 용량 20 개 로 바 뀌 었 고 배열 의 요 소 는 11 개 로 배열 의 확장 을 실현 했다.
3.removeLast 테스트 방법
System.out.println(" :");
arr.removeLast();
System.out.println(arr);
결 과 는:이때 우 리 는 하나의 요 소 를 삭제 한 후에 배열 의 용량 이 다시 10 개 로 바 뀌 었 다 는 것 을 알 수 있다.
이 절의 모든 코드:
/**
* 3.
*
*/
public class DynamicArray<E> {
// private ,
private E[] data;
private int size;//
// , capacity Array
public DynamicArray(int capacity) {
data = (E[]) new Object[capacity];//
size = 0;
}
// , capacity=10
public DynamicArray() {
this(10);
}
//
public int getSize() {
return size;
}
//
public int getCapacity() {
return data.length;
}
//
public boolean iEmpty() {
return size == 0;
}
//
public void addLast(E e) {
add(size, e);//size
}
//
public void addFirst(E e) {
add(0, e);//0
}
// index
public void add(int index, E e) {
//(1) , (3),
if (index < 0 || index > size)
throw new IllegalArgumentException(" ");
//(2) ,
if (size == data.length)
resize(data.length * 2);
// index
for (int i = size - 1; i >= index; i--) {
//(3) index , index
data[i + 1] = data[i];
}
data[index] = e;
//(4) size
size++;
}
// index
public E get(int index) {
//(1) , (2),
if (index < 0 || index > size)
throw new IllegalArgumentException(" ");
//(2) index
return data[index];
}
//
public E getLast() {
return get(size - 1);
}
//
public E getFirst() {
return get(0);
}
// index e
void set(int index, E e) {
//(1) , (2),
if (index < 0 || index > size)
throw new IllegalArgumentException(" ");
//(2) index
data[index] = e;
}
// e
public boolean contains(E e) {
for (int i = 0; i < size; i++) {
if (data[i] == e)
return true;
}
return false;
}
// e ( ), e, -1;
public int find(E e) {
for (int i = 0; i < size; i++) {
if (data[i] == e)
return i;
}
return -1;
}
// index ,
public E remove(int index) {
//1.
if (index < 0 || index > size)
throw new IllegalArgumentException(" ");
//2.
E ret = data[index];
// index (index)
for (int i = index + 1; i < size; i++) {
//3. -- index (index) ,
data[i - 1] = data[i];
}
//4. size
size--;
// loitering objects != memory leak
data[size] = null;
//
if (size == data.length / 2 && data.length != 0) {
resize(data.length / 4);
}
//5.
return ret;
}
// ,
public E removeFirst() {
return remove(0);
}
// ,
public E removeLast() {
return remove(size - 1);
}
// ( )
public void removeElement(E e) {
int index = find(e);
if (index != -1)
remove(index);
}
//
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array:size=%d, capacity=%d
", size, data.length));
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if (i != size - 1) {
res.append(",");
}
}
res.append(']');
return res.toString();
}
}
테스트 코드:
public class test {
public static void main(String[] args) {
DynamicArray<Integer> arr=new DynamicArray<Integer>(10);
for (int i = 0; i < 10; i++) {
arr.addLast(i);
}
System.out.println(" :");
System.out.println(arr);
arr.add(1, 100);
System.out.println(" e:");
System.out.println(arr);
System.out.println(" :");
arr.removeLast();
System.out.println(arr);
}
}
자바 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.