동적 배열을 사용하여 자바 (상세한) (데이터 구조)

 

코드에 아도,

클래스 이름의 시작 1. (나는 너무 다정 해요, 자신에게 이런 점을 부여)

공공  클래스 배열 <E>

첫 번째 클래스는 일반의 배열을 필요로,이 훨씬 말했다. 참고 자바 배열은 단지 하나의 유형을 보유 할 수 있습니다.


2. 멤버 변수

개인  INT의 크기; // 배열의 요소 번호 
전용 E [] 데이터; // 배열 선언


여담을 삽입 :
크기와 인덱스에 대해, 그래서 인덱스 크기가 그룹의 요소 동안, 문제의 배열, 모든 인덱스 배열의 첫 번째는 제로입니다 배우고 시작하는 때
배열이 세 가지 요소를 가지고 있다고 가정, 숫자, 다음 크기 = 3, 지수는 0.1였다. 그들은 가난한 있으며, 디자인의 마법을 내가주기의 시간에 경계 조건을 쓸 때마다 수 있도록
항상 변환합니다.
예를 들어, 어레이의 모든 요소를 순회

위한 ( int로 I = 0; I <크기; 내가 ++) {}


: 내 정신이있다
  , 마지막에 마지막 요소의 인덱스 위치는, 다음 마지막 요소의 인덱스가, for 루프에 와서하도록되어 다음 내가해야 우선, 첫 번째 단계는 0에서 시작하고 싶은
마지막 미만 요소의 다음 인덱스 위치, 인덱스보다 큰 규모의 크기, 오, 그것을 누가 다음에 마지막 요소의 다음 인덱스, 그것은 크기 여야합니다,
그래서 내가 크기를 <한다
각가 작성하는 경우 사이클 경계, 우리는 정신 아프가니스탄의 낭비 소비에 대해 생각해야 할 때. 그냥 나를 바보입니다.
마지막으로, 나의 접근 방식으로 전환되어야하는 지도 염두에두고. 당신이 직접 마음을 사용할 때마다이 그림에서 나온다.

학습의 자연은 복잡한 것을 단순화하는 것입니다.

 


3. 구성의 방법은
어레이의 사용자가 지정한 초기 용량은
사용자가 어레이의 초기 용량을 지정하지

공개 어레이 ( INT의 용량) { 
데이터 = (E []) 새로운 새 개체 [용량] 
크기 = 0 ; 
} 

공개 어레이 () {
 은이 (10); // 다른 생성자 호출과 기본 용량 10 
}


필요한 기본의 4 집

// 의 배열 요소 수를 구하는 
공개  INT {의 getSize ()
 리턴 ; 크기 
} 
// 배열 길이 얻을 
공공  의 INT () {getCapacity를
 리턴 data.length입니다 단계; 
} 
// 어레이가 비어 있는지 얻을 
공개  부울 IsEmpty 함수 () {
 복귀 크기 = = 0 ; 
}

 

5. 방법 추가

자연 배열에 추가하는 것입니다 : 지정된 인덱스에 뒤쪽에서, 각 요소는 새로운 장소에 대한 공간을 마련하기 위해, 격자를 다시 이동합니다.
초점 : 전면 후면에서
// 배열 요소 지정된 위치에 추가 지정된 인덱스 지수 E는 추가의 값 
공개  공극 추가 ( INT의 인덱스 E E) {
 // 인덱스 위치는 블라인드 삽입 될 수는 인덱스가 부정하거나 점프 그리드 보간, 없습니다. 
IF (색인 <0 || 인덱스> 사이즈) {
 드로  새로운 새 는 IllegalArgumentException ( "추가 페일 상기 요구 인덱스 <0 || 인덱스> 사이즈" ) 
} 
// 확장 메소드를 호출 할 때 어레이가 전체 용량 인 경우, 어디 이는 어레이의 두 배 길이로 확대 현재. 
IF (data.length입니다 == 사이즈) {
 이 본 .resize (data.length입니다 * 2 ) 
} 에 대해 ( int로 I = 크기 - 1].이 I> = 인덱스, 난 - ) { 
데이터 [I + +1] = 데이터 [ I]; 
} 
//구덩이 새에 
데이터 [인덱스] = ; E
 // 유지 보수 사이즈 
크기 ++ ; 

}

 

// 첫번째 배열 요소를 추가 
공개  공극 의 addFirst (E E) {
 // 직접 추가 다중화 방법을 보내고 
이 본 .add (0 ], E)를 
} 
// 마지막 요소는 어레이에 첨가 
공중  공극 (의 addLast E E) {
 // 마찬가지로 
이 본 .add (크기, E) 
}

 


6. 삭제 방법 (개인 내 값에 기초하여 삭제 삭제 인덱스에 따라 두 가지로 나눌)

자연은 삭제합니다 및 대비를 추가, 다음 위치에서 인덱스 앞으로 구덩이의 소지 다음에, 마지막 요소의 인덱스 위치의 끝에 삭제합니다. 
중요 : 정면에서 통과 할 때하는 것은 백업하기
// 제거 할 요소를 반환하는 요소를 삭제하는 인덱스 
공공 E의 제거 ( INT의 인덱스) {
 IF (인덱스 <0 || 인덱스> = 크기) {
 던져  새로운 새 "(IllegalArgumentException가 제거가 실패가의 요구 인덱스 <0 || 색인> 크기 = " ); 
} 
// 첫 번째 요소는 저장할 제거하는, 정도 커버를 제공 할 것입니다. 
값 = E 데이터 [인덱스]
 에 대한 ( INT I = 인덱스 + 1; 내가 크기 <나는 ++. {) 
데이터 [I -1] = 데이터 [I]; 
} 
// 유지 보수 사이즈 
크기 - ;
 // 여기에 왜 일반적인 이유는 기준 주소를 어레이에 저장 클래스 객체에 전달되기 때문에, 널 (null)로 설정 후, 가비지 수집기가 회수 할 수없는, 항상 열려 들었다. 
데이터 [크기 = ;
// 배열 요소의 수가 1/4 어레이의 길이와 동일한 경우 다음 볼륨 감소, 체적 감소 
IF (data.length입니다 크기 == /. 4 && data.length입니다 / 2! = 0 ) { // 부피 감소 절반의 배열 길이 이 본 .resize (data.length입니다 / 2 ) } 리턴 값; }

질문은, 왜 그냥 그것의 1/2 부피 감소 될 수있다? 그러나 그것의 분기?
여기가 뇌진탕 문제의 복잡성에 관해서 좀 더 극단적 인 경우 : 예를 들어, (10)의 배열의 용량, 배열이 가득 차있는 시점에서,이 시간이 요소와 배열 확장에 와서,이 때 배열의 다음 추가 한 요소 경우에 대한 곳 (20)의 용량, 내부 소자 (11). 이때 I 배열의 요소를 삭제할 것이고, 다음 삭제 배열 요소 수가 배열의 정확히 절반 길이 10하게 동작이 반복되고, 그래서 다음 자동 볼륨 감소하고, 각 팽창 수축 시간 복잡도를 수신하는 O (N)이기 때문에, 지연 용액 여기인가 배열 요소 수가 배열, 상기 볼륨 감소의 길이는,이 문제를 회피 한 분기가 될 때까지 기다려야한다.

 

// 삭제 된 요소의 값 
공개  공극 removeByValue (E E는) {
 // 다중화 방법은 요소의 값을 찾을 수있어서, 인덱스 (이하,이 방법)을 반환 
INT의 인덱스 = 이 본 .getByElement (E);
 IF를 ! (지수 = -1 ) {
 // 다중화 인덱스 삭제 방법에있어서, 
이 본 ) .remove (인덱스; 
} 
} 
// (A)의 첫번째 요소 제거 
공개 {) E removeFirst와를 (
 리턴  이 본 .remove하면 (0 ) 
} 
// 마지막 요소를 삭제 
공공 E removeLast () {
 반환  은이 .remove (크기 - 1. ); 
}

 


제 룩업 방법 (다시 값에 따른 인덱스에 따라 두 가지로 나눌 )

// 인덱스 룩업 배열 요소 반환 값 
공개 E하는 getByIndex ( INT의 인덱스) { 

IF (색인 <0 || 인덱스> = 사이즈) {
 드로  새로운 새 는 IllegalArgumentException가 ( "GET 페일 상기 요구 인덱스 <0 || 인덱스> 크기 = ' ); 
} 

리턴 ; 데이터 [인덱스] 
}

 

// 값은 소자 어레이를 조회의 인덱스를 반환 
공개  INT getByElement (E E) {
 // 자연 : 배열 이송 정렬 
을 위해 ( INT I = 0; I는 <크기; I ++는 ) {
 IF (데이터 [I]를. 등호 (E)) {
 반환 I을; 
} 
} 
반환 -1 ; 
}

 

// 요소가 포함되어 있는지 여부를 
공개  부울 (가) 포함 (E E는) {
 // 자연 : 배열 이송 정렬 
을 위해 ( int로 된 I = 0; I는 크기 <; I는 ++ ) {
 IF (데이터 [I] .equals (E)) {
 반환  true로 ; 
} 
} 
반환  false로 ; 
}

 


수정 항에있어서,

// 修改数组某个元素
공공  무효 세트 ( INT의 인덱스, E 전자) { 

경우 (인덱스 <0 || 인덱스> = 크기) {
 던져  새로운 , IllegalArgumentException를 ( "인덱스를 필요로 실패한다 설정 <0 || 인덱스> = 크기 " ); 
} 

데이터 [인덱스] = E; 
}

 


9. 용량 확장
성격의 확장 :이며, 새로운 배열을 열어 기존의 배열 과거의 내용을 복사합니다

개인  공극 크기 조정 ( INT newCatacity) { 
E []를 newData의 = (E는 []) 새로운 새 개체 [newCatacity]
 에 대해 ( int로 = 0 I를, I는 크기 <; I는 ++ ) { 
newData에 [I] = 데이터 [I] 
} 
/ / (설명한 메모리 맵)와 새로운 데이터 멤버 변수 참조에 재 할당 
데이터 = newData에; 
}

참조 변환 확장 메모리 맵을 그립니다

테스트 코드

 공공  정적  무효 메인 (문자열 []에 args) { 
        어레이 <정수> = 배열 새로운 어레이 (5 ); 
        array.addLast ( 1 ); 
        array.addLast ( 2 ); 
        array.addLast ( 3 ); 
        array.addLast ( 4 ); 
        array.addLast ( 5 ); 
}

 

 

 

 


10.toString 방법
에센스는 다음의 StringBuilder 객체를 생성하고 방법을 추가하도록 배열 탐색의 내용은, 모두 StringBuilder 객체를 추가한다.

@Override
public String toString () {
StringBuilder stringBuilder = new StringBuilder();
//Format(String, Object, Object) 将指定的 String 中的格式项替换为两个指定的 Object 实例的值的文本等效项。
stringBuilder.append(String.format("size =%d ,capacity =%d\n ", size, data.length));
stringBuilder.append('[');
for (int i = 0; i < size; i++) {
stringBuilder.append(data[i]);
if (i != size -1) {
stringBuilder.append(',');
}
}
stringBuilder.append(']');

return stringBuilder.toString();
}

 

最后,

浮于表面看千遍,

不如自己思一遍,

希望这篇文章能够对你起到帮助。

추천

출처www.cnblogs.com/inu6/p/11717129.html