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 函数中,您使用电话簿中的所有先前条目创建了临时数组。然后您将 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

这是你的问题:

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

    else 
        newEntry = true;

你真的想要:

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

您的条目不太可能是 == 每个条目,这意味着相同的实例,而不仅仅是等效的对象。

于 2012-06-22T04:21:16.300 回答
0

确保您已经覆盖了 Class 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 回答
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;
    }

你正在比较两个对象,所以你需要equals()在你的Entry类中覆盖,然后你需要使用ar[i].equals(ent)来检查(而不是==

另外,例如 ent 与索引 2 处的值匹配,数组大小为 4,然后最后索引newEntry将设置为 true,因此它将允许此条目,break;当您找到已经存在的条目时使用

于 2012-06-22T04:06:34.717 回答