如何在数组中查找和写下重复的元素?

时间:2015-12-14 13:29:56

标签: java

public class Pascal {

    public static void main(String[] args){
    int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};


    for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                if (i == j){
                    System.out.println(i);
                } else {
                    System.out.println("Nothing");
                }
            }
        }
    }
}

它无法正常工作。我尝试使用foreach循环,但它不起作用。我认为这几乎已经完成,我错过了一些微不足道的事情。

9 个答案:

答案 0 :(得分:2)

您的问题

  • 您正在比较i而不是array[i]
  • 你正在解析 数组两次因此每个值至少显示一次,即使 它不是重复的。

这样可以工作,但它仍会打印几次重复值:

int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13,13};

for (int i = 0; i < array.length; i++) {
  for (int j = 0; j < array.length; j++) {
    if (array[i] == array[j] && i != j){
      System.out.println(array[i]);
    }
  }
}

现在,我向您展示了解决此问题的不同风格。

在命令式风格中提供更好的解决方案。

您正在解析数组n次,这是无用的。如果数组已排序(您可以对其进行排序),您可以将元素与下一个元素进行比较,就像在此解决方案中一样:

int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};

//Optionally
Arrays.sort(array);

Integer last = null;
for(int i = 0; i < array.length -1 ; i++) {
  if(array[i] == array[i+1] && (last == null || !last.equals(array[i]))) {
    System.out.println(array[i]);
    last = array[i];
  }
}

我认为这是最有效的解决方案,但不是最易读的。

使用foreach循环的另一种解决方案

除非你明确需要访问当前元素的索引,否则使用普通的旧for循环是邪恶的,因为它引入了不必要的变量i,这会污染代码的可读性。

您可以更喜欢使用foreach语句:

int array[] = {1,2,3,3,3,4,5,6,6,7,8,8,10,10,11,12,13,13};

Set<Integer> uniqueValues = new HashSet<>();
Set<Integer> alreadyDisplayed = new HashSet<>();
for(Integer value : array) {
  if(uniqueValues.contains(value) && !alreadyDisplayed.contains(value)) {
    System.out.println(value);
    alreadyDisplayed.add(value);
  }
  uniqueValues.add(value);
}

功能风格的更好解决方案

此解决方案更符合Java8:

int array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};

//Count occurrences of each number
Map<Integer, Integer> map = new HashMap<>();
Arrays.stream(array).forEach(value -> {
  Integer occurrences = map.get(value);
  map.put(value, occurrences == null ? 1 : occurrences +1);
});

//Display number of occurrences when nbOccurrences > 1
map.entrySet()
    .stream()
    .filter(entry -> entry.getValue() > 1)
    .forEach(entry -> System.out.println(entry.getKey() + " : "+entry.getValue()));

请注意,它还会给出每个值的出现次数。如果您不需要它们,可以像以前的解决方案一样缩短代码。

逻辑风格的更有趣的解决方案。

Integer array[] = {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};

//Convert the array to a list.
List<Integer> list = Arrays.stream(array).collect(Collectors.toList());

//Use a Set in order to build the collection of unique values.
Set<Integer> uniqueValues = new HashSet<>(list);

//Remove each unique value once from the original list.
uniqueValues.stream().forEach(list::remove);

//Re-compute unique values of the resulting list and display them.
new HashSet<>(list).forEach(System.out::println);

答案 1 :(得分:1)

将“if(i == j)”替换为“if(array [i] == array [j])”

答案 2 :(得分:1)

  • 首先,您应该将array [i]与array [j]进行比较,而不是将i与j进行比较。

  • 其次,如果我= = j,你就不应该将一个元素与自身进行比较。

例如:

for (int i = 0; i < array.length; i++) {
    for (int j = i + 1; j < array.length; j++) {
        if (array[i] == array[j]) {
            System.out.println(array[i]);
        }
    }
}

这将打印重复值。

答案 3 :(得分:1)

您应该比较数组中的元素,而不是数组索引。此外,当索引相同时,数字不会重复,它只是相同的数字。

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array.length; j++) {
        if ((array[i] == array[j]) && (i != j)) {
            System.out.println(array[i]);
        }
    }
}

答案 4 :(得分:1)

如果您想使用更多空间来创建Set对象

Set<Integer> set = new HashSet<Integer>;
for (int i = 0; i < array.length; i++) {
    boolean wasAdded = set.add(i);
    if(!wasAdded){
    System.out.println(array[i]);
    }
}

答案 5 :(得分:0)

你正在使用暴力方法来做到这一点。

for (int i = 0; i < array.length; i++) {
        for (int j = i+1; j < array.length; j++) {
            if (array[i] == array[j]){
                System.out.println(i);
            } else {
                System.out.println("Nothing");
            }
        }
    }
}

答案 6 :(得分:0)

另一种可能性是使用Map来准确计算所有条目:

public class Pascal {

  public static void main(String[] args) {
    int array[] = { 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 10, 10, 11, 12, 13 };

    Map<Integer, Integer> lAllDoubleEntries = new HashMap<Integer, Integer>();

    for (int i = 0; i < array.length; i++) {
      Integer count = lAllDoubleEntries.get(array[i]);
      if (null == count) {
        lAllDoubleEntries.put(array[i], 1);
      } else {
        lAllDoubleEntries.put(array[i], ++count);
      }
    }
    for (int lKey : lAllDoubleEntries.keySet()) {
     if (lAllDoubleEntries.get(lKey)>1) {
       System.out.println("Value "+lKey+" exists in list "+lAllDoubleEntries.get(lKey)+" times");
     }
    }

  }
}

输出:

  

值3存在于列表中2次

     

值2存在于列表中2次

     

值8存在于列表中2次

     

值10存在于列表中2次

答案 7 :(得分:0)

使用Set。

的解决方案
  

不包含重复元素的集合。更正式地说,集合不包含元素e1和e2对,例如e1.equals(e2),最多只有一个null元素。

    int[] myArr =  {1,2,3,3,4,5,6,6,7,8,8,10,10,11,12,13};
    Set<Integer> mySet = new HashSet<>();

    for (int i = 0; i < myArr.length; i++) {
        if (!mySet.add(myArr[i])) {
            System.out.println(myArr[i]);
        }
    }

答案 8 :(得分:0)

Algo解释duplicate-entries-with-4kb-constraint-bit-array-is-the-solution
    public static void main(String args []){     int input [] = new int [/ *选择一个大小 /];     input [0] = / 填充数组* /     int [] isDuplicate = new int [32000&gt;&gt; 5]; //除以32         int wordNumber,mask;

    for(int i = 0; i < input.length; i++ ){
            mask = 1 << (input[i]%32);
            wordNumber = input[i]/32;
            if((mask & isDuplicate[wordNumber]) != 0){
                    System.out.println(input[i]);
            }else{
                    isDuplicate[wordNumber] |= mask;
            }
        }
   }