0

現在、多数の関数を実行するJavaプログラムに取り組んでおり、それらの関数の1つは、アルファベット順の単語の範囲を削除することです。私は例として動物を使用しています。

deleteRange関数を実行する前の表示リストは次のとおりです。

cat
chinchilla
horse
mouse
rat

プログラムにチンチラをマウスに削除するように依頼しましたが、馬は含まれていません。

public boolean deleteRange(String start, String stop){
    boolean result = false;
    int begin = Find(start);
    int end = Find(stop);
    while(begin<end){
        Delete(storage[begin]);
        begin++;
        result = true;
    }
    return result;
}

私の削除機能:

public boolean Delete(String value){
    boolean result = false;
    int location;
    location = Find(value);
    if (location >= 0) {
        moveItemsUp(location);
        numUsed--;
        result = true;
    }
    return result;
}

私の検索機能:

public int Find(String value) {
    int result = -1;
    int index = 0;
    boolean found = false;
    while ((index < numUsed) && (!found)) {
        found = (value.equals(storage[index]));
        if (!found)
            index++;
    }
    if (found)
        result = index;
    return result;
}

私のmoveitemsup関数:

private void moveItemsUp(int start){
    int index;
    for (index = start; index < numUsed-1; index++){
        storage[index] = storage[index+1];
    }
}
4

4 に答える 4

0

したがって、配列インデックスを削除します1-3---

配列インデックス1を削除すると、以前のインデックス3は2になり、「開始」をインクリメントします。したがって、インデックス2を削除します。この場合はマウスです。したがって、馬はスキップされます。

代わりに、削除する要素の数を維持する必要があります(end --begin + 1)

int count = end - begin + 1;
while ( count > 0 ) {
Delete(storage[begin]);
}

それらの線に沿って何か。

于 2013-02-18T23:31:58.433 に答える
0

リストがArrayListにある場合(このボックスにはJavaのものがないため、これはテストされていません)、このようなものを試してみませんか。

public boolean deleteRange( String start, String stop ) {
    for(Iterator<String> iter = storage.iterator();iter.hasNext();) {  
        String element = iter.next();  
        if(element.compareTo(start) >= 0 && element.compareTo(stop) <= 0 ) {  
            iter.remove();  
        }  
    }
}
于 2013-02-18T23:41:40.607 に答える
0

私が見ることができる問題は次のとおりです。

問題1

削除するたびに、インデックスを増やしbegin、同時に配列を「縮小(実際には縮小しない)」します。

例えば

[a,b,c,d,e,f]b-e、インデックスを削除したいとします1-4

最初に削除b (index 1)し、次にmoveItemsUp削除した後。したがって、配列は次 [a,c,d,e,f,f]のようになります。次に、begin++開始は2で、ポインティングd、ジャンプします。c

問題2

問題1を修正した場合、削除後、配列が必要なものであるかどうかを考慮する必要がある別のことがあり[a,f,f,f,f,f]ます。

ところで、使用を検討してみませんLinkedListか?削除の方がはるかに速いはずです。

于 2013-02-18T23:47:10.257 に答える
0
    int begin = Find(start);
    int end = Find(stop);
    int count = end - begin;
    for (int i=0; i <= count; i++){
        Delete(storage[begin]);
        result = true;

いくつかのコードをこれに変更し、動作させました=)

于 2013-02-19T02:38:26.410 に答える