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

Java 在阵列中显示没有冗余的元素,java,arrays,algorithm,redundancy,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].getC

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

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());
}
public void display(){
对于(int i=0;i对于(int j=0;j将tabT数组放入一个集合中。将不会有重复项

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

如果你想跟踪重复计数,你可以考虑一个HashMap。一次迭代一次数组,将对象放在哈希图中,并将它们各自的计数放在哈希图中。然后再次对数组进行检查,以防HashMap。这将是O(n)时间,而不是潜在的O(n ^ 2)

对象,通过<代码>等式()进行比较。
例如

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());
}
for(int i=0;i对于(int j=i+1;j
=
!=
在对象级别测试相等性(即,如果两个实例相同)。您需要的是比较每个对象表示的值(例如,如果两个字符串相等),然后需要询问是否
!tabT[i].equals(tabT[j])
,并使
选项卡的元素实现
等于

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

T[] tabT = ...
Set<T> set = new LinkedHashSet<T>(Arrays.asList(tabT))
for (T t:set) System.out.println(t);
T[]选项卡=。。。
Set=newlinkedhashset(Arrays.asList(tabT))
对于(T:set)系统,输出println(T);

我使用了
LinkedHashSet
,因为它保留了数组中元素的顺序。请注意,您需要实现
equals
hashcode
为什么不尝试类似的方法?(我假设您正在使用字符串类型)

HashSet HashSet=newhashset();
对于(int i=0;i
不能将重复项放入集合中,因此现在可以迭代集合以获得唯一项

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

while (iterator.hasNext()) {
    System.out.println((String)iterator.next());
}
java.util.Iterator Iterator=hashSet.Iterator();
while(iterator.hasNext()){
System.out.println((字符串)迭代器.next());
}

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

制作一个temp(helper)数组,该数组将包含迄今为止在
选项卡中看到的每个元素。然后,在打印值之前,检查它是否未出现在helper数组(tmp)中

例如,如果在
选项卡
中有值,并且不希望每个值打印一次以上:

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]);
}
int[]tabT={1,2,3,1,1,2,6,7,2,7,1};
int[]tmp=新的int[tabT.length];
布尔标志;
对于(int i=0;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());
    }
}
Cars[]tmp=新车[tabT.length];//假设tabT来自类型Cars[]
布尔标志=真;
对于(int i=0;i

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

在练习中,我应该在数组中有重复的项,但当我显示它们时,它们应该没有冗余。@mpluse:您可以始终转换为一个集合来删除重复项并保持原始集合的完整性谢谢您,但“tmp”这里不是空的?那么我如何删除数组呢?这里有一个问题。如果(tabT[I].getCar().equals(tabT[j].getCar())&&I!=j)你应该知道如何处理它。我给了你一个很好的方法。你的工作是做一些小的更改以使它工作。我不知道你的类和变量。我想这是tmp[j].getCar().equals..不是tabT[i].getCar().equals我用另一种方法找到了它。无论如何,谢谢:)这仍然会将每个项目打印多次(如果它出现多次..)
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());
    }
}