0

この配列に ENTRY 型の要素を追加しようとしています。しかし、追加する前に、エントリが重複したくないので、重複していないことを確認したいと思います。たくさん試しましたが、エントリが追加されません:/ IF 句から BREAK を試してもうまくいかなかったようです。私が見逃している本当にばかげたものはありますか?誰かが私を助けてくれれば本当に感謝します。乾杯

import java.util.Arrays;

public class PhoneDirectory {
    private Entry[] ar;
    static int index = 0;

    public PhoneDirectory() {
        ar = new Entry[0];
    }

    public PhoneDirectory(Entry[] ent) {
        ar = ent;
    }

    public boolean addEntry(Entry ent) throws NullPointerException {

        boolean newEntry = true;
        for (int i = 0; i < ar.length; i++) {

            if (ar[i] == ent) {
                newEntry = false;

            else 
                newEntry = true;
        }

        int length = ar.length;
        Entry[] temp = new Entry[length];

        for (int x = 0; x <= length - 1; x++) {

            temp[x] = ar[x];
        }

        length++;
        ar = new Entry[length];

        // add the new entry in the last index
        for (int i = length - 1; i >= 0; i--) {

            if (newEntry == true) {

                ar[i] = ent;
                newEntry = false;
                // return true;
            } else {

                // ar[i] = temp[i];
                return false;
            }
        }

        return true;

    }
}
4

4 に答える 4

0

addEntry 関数では、PhoneBook 内の以前のすべてのエントリを含む一時配列を作成しました。次に、ar を新しい配列として再割り当てしました。ただし、temp に保存した以前のエントリを新しい ar に再​​設定したことはありません。

length++;
ar = new Entry[length];

//copy the temp entries back into the new ar
for (int i=0; i<= temp.length-1; i++){
  ar[i] = temp[i];
}

また、newEntry ループにブレークを追加する必要があります。

boolean newEntry = true;
for (int i = 0; i < ar.length; i++) {

    //comparing object should use equals
    if (ar[i].equals(ent)) {
        newEntry = false;
        //add break;
        break;
    }
    else 
        newEntry = true;
}

最新のエントリを追加するために for ループは必要ないと思います

それ以外の :

   for (int i = length - 1; i >= 0; i--) {

        if (newEntry == true) {

            ar[i] = ent;
            newEntry = false;
            // return true;
        } else {

            // ar[i] = temp[i];
            return false;
        }
    }

これを試して

int i = length-1;

if (newEntry == true) {
  ar[i] = ent;
  newEntry = false;
  return true;
} else {
   return false;
}
于 2012-06-22T04:17:06.233 に答える
0

を使用Setして、データを動的に追加し、一意性を維持できます

Set<Entry> entries = new HashSet<Entry>();
//note you will have to implment `equals()` & `hashcode()` in `Entry` class
//and then simply
entries.add(entry1);
entries.add(entry2);
entries.add(entry3);

それはあなたがそれを処理する必要がないそれ自体で成長します+それは独自性を維持します,

セット内の順序を保持したい場合は、使用する必要がありますLinkedHashSet

あなたのコードで

for (int i = 0; i < ar.length; i++) {

        if (ar[i] == ent) {
            newEntry = false;

        else 
            newEntry = true;
    }

2つのオブジェクトを比較しているので、クラスでオーバーライドする必要がequals()ありEntryar[i].equals(ent)チェックするために使用する必要があります(ではなく==

また、たとえば、ent はインデックス 2 の値と一致し、配列のサイズは 4 であり、最後にインデックスnewEntryが true に設定されるため、このエントリが許可されbreak;ます。既存のエントリが見つかった場合に使用します

于 2012-06-22T04:06:34.717 に答える
0

これはあなたの問題です:

    if (ar[i] == ent) {
        newEntry = false;

    else 
        newEntry = true;

あなたが本当に欲しいもの:

if (ar[i].equals(ent)) {

エントリがそれぞれに対して == になることはほとんどありません。これは、同等のオブジェクトではなく、同じインスタンスを意味します。

于 2012-06-22T04:21:16.300 に答える
0

クラス ENTRY で equals メソッドをオーバーライドしたことを確認してください

for (int i = 0; i < ar.length; i++) {

    if (ar[i].equals(ent)) {
        newEntry = false;
        break;
    }
    else 
        newEntry = true;
}
于 2012-06-22T04:21:52.043 に答える