显示数组中没有冗余的元素



我编写了这段代码。我认为这是错误的。

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

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

如果您只想使用数组,您可以这样做:

创建一个临时(helper)数组,它将包含到目前为止在tabT中看到的每个元素。然后,在打印该值之前,检查它是否没有出现在helper数组(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());
    }
}

这将只打印每辆车(或任何你要打印的)一次。

通过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的所有非重复组合,因此我们不会多次比较它们。

==!=在对象级别测试相等性(即,如果两个实例相同)。你所需要的是比较每个对象所代表的值(例如,如果两个字符串相等),然后你需要询问!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

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

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

为什么不试试呢?(我假设你正在使用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());
}

如果需要跟踪重复计数,可以考虑使用HashMap。通过数组迭代一次,将具有各自计数的对象放入HashMap中。然后根据HashMap再次遍历数组。这是O(n)时间而不是O(n^2)

最新更新