0

一連の属性を持つContactというオブジェクトがあります。Contact_Listという連絡先の配列もあり、Contactオブジェクトを追加するContact_Listのメソッドを作成する必要があります。その部分は簡単ですが、その中のすべての連絡先が姓に基づいて順番になっていることを確認する必要があります。家系の名前の文字列を返すgetLastNameというアクセサがすでにありますが、メソッドに連絡先を追加して注文するにはどうすればよいですか?助けてください、これは1時間半で期限が切れます!

 public void add(Contact frnd)
 {
     if(numContacts == MAX_CONTACTS) // If the List is already full
     {
      System.out.println("The Contact List is already at Maximum Capicity");
     }
     else
     {
      numContacts += 1; // There is one more Contact
      Contact_List[numContacts - 1] = frnd; // Assigns the Last Open Spot the new Contact
     }
 }
4

4 に答える 4

2

オブジェクトを順序付けするために必要なロジックを実装できる場所Arrays.sort()を受け入れます。配列の代わりに sを並べ替えたい場合Comparatorもあります。Collections.sort()List

編集:私が正しいことをしているのかどうかはよくわかりませんが、Javaでそのような要件をどのように実装するかについて、特定の質問に答えようとします。ただし、内部で配列を使用し、配列の (再) 割り当てを処理し、並べ替えロジックを手動で実装する必要がある場合、これはあまり役に立ちません。

private final Set<Contact> contacts = new TreeSet<Contact>( new Comparator<Contact>() {
    @Override
    public int compare(Contact c1, Contact c2) {
        return c1.getLastName().compareTo(c2.getLastName());
    }
});

public void add(Contact contact) {
    contacts.add(contact);
}

public Contact[] getContacts() {
    return contacts.toArray(new Contact[contacts.size()]);
}

さらに、姓がそれらの連絡先の自然な順序を提供する場合は、むしろContactクラスを実装して、にComparableを提供する必要をなくしたいと思います。ComparatorTreeSet

于 2013-03-22T02:00:40.247 に答える
1

これはうまくいくかもしれません

public static void add(Contact frnd) {
    if (contactList.length == MAX_CONTACTS) {
        throw new IllegalStateException("The Contact List is already at Maximum Capicity");
    }
    int i = Arrays.binarySearch(contactList, frnd, new Comparator<Contact>() {
        public int compare(Contact o1, Contact o2) {
            return o1.getLastName().compareTo(o2.getLastName());
        }
    });
    if (i < 0) {
        i = -i - 1;
    }
    Contact[] temp = new Contact[contactList.length + 1];
    System.arraycopy(contactList, 0, temp, 0, i);
    temp[i] = frnd;
    if (i < contactList.length) {
        System.arraycopy(contactList, i, temp, i + 1, contactList.length - i);
    }
    contactList = temp;
}

しかし、このタスクには List または TreeSet の方が適しているようです。

于 2013-03-22T02:17:53.447 に答える
0

簡単な解決策は、連絡先を次の位置に追加し (現在行っているように)、追加後に配列を並べ替えることです。これにより、常に正しい並べ替え順序になります。

最後の連絡先を追加した後、カスタム コンパレータを使用して並べ替えます。

if (numContacts == MAX_CONTACTS) {
Arrays.sort(contacts, new Comparator<Contact>() {
    public int compare(Contact o1, Contact o2) {
        return o1.getLastName().compareTo(o2.getLastName());
    }
});
}


また、次の 2 行:

numContacts += 1;
Contact_List[numContacts - 1] = frnd;

単純に置き換えることができます:

Contact_List[numContacts++] = frnd;
于 2013-03-22T03:09:33.683 に答える
0

この例でできる最も簡単なことは、要素を配列に追加するときに要素をソートすることです。

あなたはあなたの

  numContacts += 1; // There is one more Contact
  Contact_List[numContacts - 1] = frnd; // Assigns the Last Open Spot the new Contact

配列をトラバースし、アイテムを挿入する適切な場所を見つけるコードを使用します。アイテムを単に最後に配置する代わりに。

たとえば、配列内にこれらの姓を持つ 4 人がいるとします。

Anthony
Adam
Cindy
Dirk

ここで、ブライアンの連絡先を挿入します

ループで配列をステップ実行し、最初の位置をチェックして 0 番目のインデックスに属しているかどうかを確認します。この場合、Anthony は Brian の前に来るので、そうではありません。次に、最初のインデックスを確認しますが、この場合、Adam が Brian の前にあるため、そうではありません。次に、2 番目のインデックスを確認します。あはは!ブライアンはアダムの後、シンディの前に来る。これは、配列に Brian を挿入する正しい場所です。これで、配列は次のようになります。

Anthony
Adam
Brian
Cindy
Dirk

この方法で「挿入」メソッドを記述すると、アイテムを追加するときに配列が常にソートされたままになることが保証されます。配列の代わりに ArrayList を使用することで、あなたの人生はずっと楽になります。Java を使用してきた間ずっと、99.9% の確率で Array よりも ArrayList を使用してきました。

于 2013-03-22T02:14:56.200 に答える