将NON重复元素添加到可扩展数组中

时间:2012-06-22 04:05:32

标签: java arrays

我正在尝试在此数组中添加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 个答案:

答案 0 :(得分: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)来检查(而不是==)< / p>

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

这是你的问题:

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

    else 
        newEntry = true;

你真的想要:

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

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

答案 3 :(得分:0)

确保已在类ENTRY

上覆盖了equals方法
for (int i = 0; i < ar.length; i++) {

    if (ar[i].equals(ent)) {
        newEntry = false;
        break;
    }
    else 
        newEntry = true;
}