显示阵列中没有冗余的元素

时间:2013-03-11 20:27:55

标签: java arrays algorithm redundancy

我制作了这段代码。我认为这是错误的。

public void display() {
    for (int i = 0; i < tabT.length; i++)
        if (tabT[i] != null)
            for (int j = 0; j <= i; j++)
                if (tabT[i] != tabT[j])
                    System.out.println(tabT[i].getCar());
}

如何在数组中显示没有冗余的元素?

6 个答案:

答案 0 :(得分:1)

通过equals()比较的对象例如

if (!tabT[i].equals(tabT[j]))

您正在比较参考值而不是对象

for (int i=0; i< tabT.length; i++) {
  boolean f = false;
  for (int j=i+1; j <tabT.length; j++)
    if (tabT[i].equals(tabT[j])) {
      f=true;
      break;
    }
  if (!f)
    System.out.println(tabT[i].getCar());
}

这应该为您提供ij不重复的所有组合,因此我们不会多次比较它们。

答案 1 :(得分:1)

如果您只想使用数组,可以执行以下操作:

创建一个临时(辅助)数组,其中包含目前在tabT中看到的每个元素。然后,在打印值之前,检查它是否没有出现在辅助数组(tmp)中。

例如,如果您的值为tabT,并且您不想多次打印每个值:

int[] tabT = {1,2,3,1,1,2,6,7,2,7,1};
int[] tmp = new int[tabT.length];
boolean flag;
for (int i = 0; i < tabT.length; i++) {
    tmp[i] = tabT[i];
    flag = true;
    for (int j = 0; j < tmp.length; j++)
        if (tabT[i] == tmp[j] && i!=j) {
            flag = false;
        }
    if(flag)
        System.out.println(tabT[i]);
}

输出:[1,2,3,6,7]

您可以轻松地将此想法应用到您的程序中,并且您只需打印一次元素:

Cars[] tmp = new Cars[tabT.length]; //Assuming tabT is from type Cars[]
boolean flag = true;
for (int i = 0; i < tabT.length; i++) { 
    tmp[i] = tabT[i];
    if (tabT[i] != null) {
        for (int j = 0; j < tmp.length; j++)
            if (tabT[i].getCar().equals(tabT[j].getCar()) && i!=j)
                flag = false;
        if(flag)
            System.out.println(tabT[i].getCar());
    }
}

这将只打印一辆汽车(或任何你正在打印的汽车)。

答案 2 :(得分:0)

将tabT数组放入Set中。没有重复的项目。

Set tabTList = new HashMap(Listjava.util.Arrays.asList(tabT);

答案 3 :(得分:0)

如果您想要跟踪重复计数,可以考虑使用HashMap。迭代数组一次,将对象放入HashMap及其各自的计数。然后再次遍历数组,检查HashMap。这将是O(n)时间而不是潜在的O(n ^ 2)

答案 4 :(得分:0)

==!=测试对象级别的相等性(即两个实例是否相同)。你需要的是比较每个对象所代表的值(例如,如果两个字符串是等于的),那么你需要询问是否!tabT[i].equals(tabT[j]),并使tabT的元素实现equals

或者将数组转换为集合,从而删除重复项。

T[] tabT = ...
Set<T> set = new LinkedHashSet<T>(Arrays.asList(tabT))
for (T t:set) System.out.println(t);

我使用了LinkedHashSet因为它保留了数组中元素的顺序。请注意,您需要实施equalshashcode

答案 5 :(得分:0)

为什么不尝试这样的事情呢? (我假设您正在使用String类型)

HashSet<String> hashSet = new HashSet<String>();

for (int i = 0; i < tabT.length; i++) {
    hashSet.add(tabT[i]);
}

您不能将重复项放入集合中,因此现在您可以迭代该集合以获取唯一身份。

java.util.Iterator<String> iterator = hashSet.iterator();

while (iterator.hasNext()) {
    System.out.println((String)iterator.next());
}