1

我做了这个代码。我认为这是错误的。

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());
}

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

4

6 回答 6

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());
}

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

于 2013-03-11T20:33:07.483 回答
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());
    }
}

这将只打印每辆车(或您正在打印的任何东西)一次。

于 2013-03-11T20:38:54.763 回答
0

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

Set tabTList = new HashMap(Listjava.util.Arrays.asList(tabT);
于 2013-03-11T20:29:41.800 回答
0

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

于 2013-03-11T20:32:54.647 回答
0

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

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

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

我使用 a 是LinkedHashSet因为它保留了数组中元素的顺序。请注意,您需要实现equalsand hashcode

于 2013-03-11T20:33:24.820 回答
0

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

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());
}
于 2013-03-11T20:37:17.310 回答