【问题标题】:Searching duplicates in 2 dimensional array在二维数组中搜索重复项
【发布时间】:2016-01-19 00:24:06
【问题描述】:

我有像这样的二维数组:

{2 , 6 , 46, 8 , 7 , 25, 64 , 9 , 10},
{6 , 10, 50, 12, 11, 29, 68 , 13, 14},
{46, 50, 90, 52, 51, 69, 108, 53, 54}

我怎样才能找到像'6', '46' and '50'这样的重复元素?

我的代码发现连续重复:

    for (int i = 0; i < a2.length; i++) {
        for (int j = 0; j < a2[i].length; j++) {
            cursor = a2[i][j];

            if(j + 1 < a2[i].length){
                if(cursor == a2[i][j + 1]){
                    System.out.println(cursor + "has duplicate in this array");
                }
            }
        }
    }

【问题讨论】:

  • 如果要删除重复元素,请将所有数字放入一个 Set 中。
  • 您要打印重复元素还是查找您的数组是否包含重复元素
  • j 的范围不是 0 到 a.length。它应该是 0 到 a[i].length。此外,此代码未找到通用重复项。它只寻找连续的重复项。这是你的意图吗?
  • 我要查找通用重复项
  • 查找通用重复项的通用方法是:对于每个元素,查看它是否与元素的任何 rest 匹配。所以你的for 循环需要这样做。您当前的循环不断更改您正在比较的条目与当前条目。比较 rest 元素的 all 时,需要保持稳定。顺便说一句,在您显示的代码中,您添加了我的更正,但忽略了我认为您会接受的其他相关更正:if ( j + 1 &lt; a[i].length ) 将替换if ( j + 1 &lt; a.length )。如果你想让它工作,你真的需要仔细考虑你的代码。

标签: java arrays loops multidimensional-array duplicates


【解决方案1】:

遍历所有元素并将其保存在一个临时集合中。
当您遇到重复时,列表将包含它。

import java.util.HashSet;
import java.util.HashSet;

public class HelloWorld
{
  public static void main(String[] args)
  {
    int[][] arr = {
      {2 , 6 , 46, 8 , 7 , 25, 64 , 9 , 10},
      {6 , 10, 50, 12, 11, 29, 68 , 13, 14},
      {46, 50, 90, 52, 51, 69, 108, 53, 54}
    };

    HashSet<Integer> elements = new HashSet<>();
    HashSet<Integer> duplicates = new HashSet<>();
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[i].length; j++) {
            if(elements.contains(arr[i][j])) {
                duplicates.add(arr[i][j]);
            }
            elements.add(arr[i][j]);
        }
    }

    System.out.println(duplicates.toString());
  }
}

输出:

[50, 6, 10, 46]

【讨论】:

  • 不使用“Hash Set”有什么解决办法吗?
  • @OCY - 是的。你为什么不试着自己弄清楚呢?这样你会学到更多。
【解决方案2】:

试试这个代码:-

import java.util.Arrays;
import java.util.List;

public class ArrayTest {

    public static void main(String[] args) {

        Integer[][] myarray = new Integer[][]{
                  { 10, 20, 30, 40 },
                  { 50, 77, 60, 70 },
                  { 33, 22, 88, 99 },
                  { 21, 66, 65, 21 } 
                };
        int i,j;
        for(i=0;i<myarray.length;i++)
        {
            for(j=0;j<myarray.length;j++)
            {
                int temp= myarray[i][j];
                 myarray[i][j]=0;
                 List<Integer> rowvalues = Arrays.asList(Arrays.asList(myarray).get(i));
                 Boolean b=rowvalues.contains(temp) ;
                 if(b==true)
                 {
                     System.out.println("duplicate at ["+i+"]["+j+"] is: "+temp);
                 }
                 myarray[i][j]=temp;
            }
        }




    }

}

【讨论】:

  • 这不会找到所有重复项,因为它只搜索当前子数组。您也可以重构 Arrays.asList(Arrays.asList(myarray).get(i)) 只进行一次转换,而不是在每个循环中。
猜你喜欢
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多