【问题标题】:Searching for repeated entries in a 2d integer array在二维整数数组中搜索重复条目
【发布时间】:2014-03-03 10:52:10
【问题描述】:

我有一个二维整数数组,每个索引中有 3 个数字。

例如:

   examplearray=new int[][]
   {

        {0, 0, 0},
        {0, 1, 0},
        {0, 0, 1},
        {1, 0, 1},

   };

我想知道每个索引中的前两个数字是否与任何其他索引中的前两个数字匹配。

在本例中,{0,0,0}{0,0,1} 的前两个数字相同。我想创建一个可以表明这一点的代码。

【问题讨论】:

标签: java arrays


【解决方案1】:

最好的方法是创建一个表示外部数组成员的键类。 hackiest/fastest 方法是使用 long 将前两个数字填充在一起:

Set<Long> keys = new HashSet<>();
for (int[] innerArray : examplearray) {
  long key = ((long) innerArray[0] << 32) | innerArray[1];
  if (keys.contains(key)) {
    System.out.println(Arrays.toString(innerArray) + " has duplicate entries");
  }
  keys.add(key);
}

【讨论】:

  • 多么棒的解决方案!
【解决方案2】:

如果您的意思是与另一个条目的前两位数字相同的条目,您可以试试这个

ArrayList<String> entries = new ArrayList<String>
for (int i = 0; i < examplearray.length; i++) {
  if (entries.indexOf( examplearray[i][0] + " " + examplearray[i][1] )) {
    // here is a duplicate
  } else {
    entries.add( examplearray[i][0] + " " + examplearray[i][1] );
  }
}

【讨论】:

  • 这行得通,但它是 O(n^2),你可以使用散列集变得更快,但是当有替代方法可用时使用字符串转换并不“好”
  • 它比使用 32 位移位和 an or haha​​ 更具可读性,但无论适用于何种应用,这两种解决方案都很好
  • 我看不出这是O(n^2)吗?
  • indexOf 是线性时间复杂度
  • indexOf 检查条目是否已经在数组中是 O(n)
猜你喜欢
  • 2018-01-16
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2019-10-27
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多