2015-05-17 142 views
0

我有一种方法可以生成一个字符串的二维数组,然后将它们放在一个ArrayList。我正在尝试编写一种方法,该方法需要一个新的2D数组,并将其与阵列中已有的数据进行重复检查。这是我迄今为止,它应该返回true一个新的解决方案,但它每次返回false。调用方法打印出阵列,我可以看到它们不一样。比较字符串的二维数组

public static boolean tester(String[][] b, ArrayList<String[][]> s) 
{ 
    if (s.size() == 1) return true; 
    boolean n = true; 
    int count; 
    int size = b.length * b[0].length; 

    for (int i = 0; n && i < s.size() -1; i ++) 

    { 
     count = 0; 
     for (int j = 0; j < s.get(i).length; j ++) 
      for (int k = 0; k < s.get(i)[0].length; k ++) 
       if (s.get(i)[j][k].equals(b[j][k])) count ++; 
        if (count == size) n = false; 

    } 

    return n; 
} 
+1

*“字符串的双阵列” *其称为二维阵列,或二维数组短。编程中的'double'这个术语是'保留'的,用于'double'类型。与你的回答/问题无关,但我必须阅读一些句子以确保我正在低估它;) –

回答

0

您的代码可以得到方式简单使用Arrays.deepEquals

public static boolean nonDuplicate(ArrayList<String[][]> s, String[][] b){ 

    for(String[][] e : s){ 
     if(Arrays.deepEquals(e, b)) return false; //e and b are duplicates 
    } 

    return true; 
} 

您的代码可能是不正确的,因为你没有使用大括号({})在你的for循环。所以,当你说:

for (int j = 0; j < s.get(i).length; j ++) 
     for (int k = 0; k < s.get(i)[0].length; k ++) 
      if (s.get(i)[j][k].equals(b[j][k])) count ++; 
       if (count == size) n = false; 

它被解释为:

 for (int j = 0; j < s.get(i).length; j ++){ 
     for (int k = 0; k < s.get(i)[0].length; k ++){ 
      if (s.get(i)[j][k].equals(b[j][k])) count ++; 
     } 
     } 

     if (count == size) n = false; 

这很可能不是你的意识判定你的压痕,但值得注意的是白色空间(包括缩进)并不意味着(?)除了分离令牌外,还有很多Java。

+0

deep.equals的解决方案仍然每次都会返回false ...我开始怀疑如果在代码的其他地方发生了一些奇怪的事情,然而,我将每个二维数组打印出来,因为它被添加到数组列表中,我可以看到它们不是相同的,所以我不知道它可能是什么。 – cae52

+0

嘿,谢谢你的帮助。这实际上是程序中其他地方的一个问题 - 数组列表完全充满了对相同d2d darrays的引用。 – cae52

0

这是怎么了你的代码被编译器解释:

for (int i = 0; n && i < s.size() -1; i ++) 
{ 
    count = 0; 
    for (int j = 0; j < s.get(i).length; j ++) { 
     for (int k = 0; k < s.get(i)[0].length; k ++) {   
      if (s.get(i)[j][k].equals(b[j][k])) count ++; 
     } 
    } 
    if (count == size) n = false; 
} 

恕我直言尽力总是使用{}阐明你的意图,你的代码的编译器/读写器。

我猜你想是这样的:

for (int i = 0; n && i < s.size() -1; i ++) 
{ 
    count = 0; 
    for (int j = 0; j < s.get(i).length; j ++) { 
     for (int k = 0; k < s.get(i)[0].length; k ++) {   
      if (s.get(i)[j][k].equals(b[j][k])) { 
       count ++; 
      } 
      if (count == size) { 
       n = false; 
      } 
     } 
    } 
} 

但你也可以这样写:

public static boolean tester(String[][] b, ArrayList<String[][]> s) 
{ 
    // .. 

    for (int i = 0; n && i < s.size() -1; i ++) { 
     for (int j = 0; j < s.get(i).length; j ++) { 
      for (int k = 0; k < s.get(i)[0].length; k ++) { 

       if (s.get(i)[j][k].equals(b[j][k]) == false) { 
        return true; 
       } 
      } 
     } 
    } 

    return false; 
} 
+0

如果明白写,不会停止并返回“假”,只要它不符合数组列表中的任何一个2D数组?我需要它继续浏览整个列表。 – cae52