머리말
지난 밤에 나는 해시 맵에서 구현되었을 때 int의 경고를하였습니다 오늘날의 특정 Eclipse 통지.
더 나은 성능을 위해 새로운 sparsearray <string> (...)를 사용하십시오
이 경고는 SparSearray를 사용하여 더 나은 성능을 얻는 것을 의미합니다.
소스 코드
Sparsearray의 전체 코드는 비교적 간단하기 때문에 먼저 소스 코드를 표시 한 다음 SparsearRay를 사용하는 이유를 분석하십시오.
공개 클래스 <e>는 클로닝 가능 {private starting hat 객체 = false; * * 새 Sparsearray는 MAPPING을 제작하지 못하는 매핑을 작성하지 않습니다. requering arlocations = 새로운 객체 [initialcapacity];} msize = 0;}} @override @suppresswarnings ( "확인되지 않은") public sparsearray <e> clone (sparsearray <e> clone = null; ) super.clone (); clone.mkeys = mkeys.clone (); mvalues.clon e (); * 사양 키에서 객체 MAPD를 가져 오거나 < / null < / code> * 그러한 매핑이없는 경우 * / public e get (int key) {return get (key, null);} / ** *. 지정된 키에서 맵핑 된 객체를 가져 오거나, 그러한 핑이 만들어지지 않은 경우 */ @suppresswarnings ( "unched")) public e get (int key, e valueifnynotfound) {int i = containerhelpers.binarysearch (mkeys. , msize, 키); 지정 키가 있으면 * / public void delete (int i = containsearge) (mkeys, msize, key) {if (mvalues [i]); {mgarbage = true;} {@link #delete (int)} {int key) {delete (key). ;}/ ** *지정된 인덱스에서지도를 제거합니다 ;} / ** * 배치로 매핑을 제거합니다. (msize, index+size); "sparsearray", "int n = mkeys; ) {객체 값 = 값 [i]; if (i! = o) {키 [o] = valus [i] = null; } o ++;}} mgarbage = msize = o; 하나가 있습니다. *public void put (int key, e value) {int i = cantiorhelp ers.binarysearch (mkeys, msize, key) {mvalues [i] = value;}. {i = ~ i; mkeys.length) {gc (); indiares가 변경되었을 수 있습니다. msize + 1); int [] nkeys = new 객체 [] nvalues = new Object [n]; " + n); system.arraycopy (mkeys, 0, nkeys, mkeys.length); System.ArrayCopy (mvalues, 0, nvalues, 0, mvalues.length); ys; mvalues = nvalues;} if (msize -i! (mvalues, i+1, msize); / public int size () {gc ();} return msize;} / ** * ** * ange <code> 0 ... size () -1 < / code>에 제공됩니다. <code> index </code> the * sparsearray 스토어가 오름차순으로 보장됩니다. key and <code> keyat (size () -1) < / code>는 larges * 키를 반환합니다. mkeys [index];}/** * 범위 <code> 0 ... size () -1 </code> 범위의 인덱스가 주어지면 <code> index </code> th key-에서 값을 반환합니다. 이 * sparsearray 스토어를 매핑하는 것은 * <p> valuespondid to eScending 순서입니다. 가장 작은 키 및 값과 관련하여 (size () -1) </ c index) {if (mgarbage) {gc ();} return (e) es [index];} / * * 범위 <code> 0 ... size () -1 < /code>, 이 * sparsearray st. } mvalues [index] = value;} / ** * 지정된 키가 지정된 키를 반환하는 인덱스를 반환합니다. / public indexofkey (int key) {if (mgarbage) {gc ();} return c ontainerhelpers.binarysearch (mkeys, msize, key);} / *** {@link #valueat}가 * 지정된 키 또는 키가없는 경우 * <p> 키가 Key의 조회와 달리 선형 검색이라고 말하면 동일한 값에 매핑 될 수 있습니다. 그중 하나만 찾으십시오. * <p> 대부분의 컬렉션 exof} 메소드와 달리이 메소드는 {@ code equals} 대신 {@ code ==}를 사용하여 값을 비교합니다. if (mgarbage) {gc ();} for (i <msize; i ++) if (mvalues [i] == value) return i; 이 sparsearray. msize = 0; mgarbage = false;} /*** 키 /값 쌍을 배열에 넣습니다. 키는 배열의 모든 기존 키보다 큽니다 (int key, e value). if (msize! = 0 && k <= msize) {key, value); ) {int n = arrayalintarraysize (pos + 1); new int [] new [n]; mkeys.length + " + n); pos] = key; mvalues [pos] = msize = pos + 1; {@inheritdoc} * * * <p>이 맵을 반복하여 문자열을 구성합니다 itseel을 값으로 포함하면 st ring "(이지도)" *가 그 자리에 나타납니다. 버퍼 = 새 StringBuilder (msize * 28); } keyAT (i); else {buffer.append ( "("( "("end ( '}'); return buffer.toString ();}}
먼저 Sparsearray의 생성자를보십시오.
/*** 맵핑이 포함 된 새로운 sparsearray를 만듭니다.* /public sparsearray () {this (10);} /*** 지정된 수의 추가 메모리 alocation이 필요할 새로운 sparsearray no 맵핑을 만듭니다. 매핑. mvalues = containerhelpers.empty_objects;} else {arrayalintarraysize ialcapacity);생성자에서 컨테이너의 크기가 미리 설정되고 기본 크기는 10임을 알 수 있습니다.
데이터 작업 추가를 살펴 보겠습니다.
/ ** * 지정된 키에서 지정된 값에 매핑을 추가합니다. BinarySearch (mkeys, msize, key) {mvalues [i] = value;} {i = ~ i; {mkeys [i] = value; , msize, key);} if (msize> = mkeys.length) {int n = arrayutils.idealintarraysize (msize + 1); .E (Sparsearray "," + mkeys.length + "는" + n); mvalues = nvalues;} if (msize -i! = 0) {// log.e ( "sparsearray", "move" + (msize -i)); 1, msize.arraycopy (mvalues, i +1, mkeys [i] = mvalues;
데이터 확인 방법을보십시오.
/** * 지정된 키에서 매핑 된 객체를 가져옵니다. * 지정된 키에서 맵핑 된 객체를 가져옵니다. (i <0 || mvalues [i] == 삭제) {return valueifkeynotfound;} else {return (e) mvalues [i];}}.
데이터를 넣고 데이터를 얻는 과정에서 듀얼 포인트 검색 알고리즘을 균일하게 호출합니다.
정적 int binarysearch (int [] 배열, int 값) {int lo = 0; 1; 1; 1; ;} else {return mid; 나는 개인적으로 (lo + hi) >>> 1의 방법이 약간 이상하다고 생각하며 lo + (hi -lo) / 2를 직접 사용하는 것이 좋습니다.