如何检查数组中的所有重复项是否已分组

时间:2017-09-10 06:17:56

标签: java arrays list duplicates grouping

我想检查数组或列表中的所有类似整数是否已分组。 {2, 2, 5, 5, 5, 1, 7, 7, 5, 7}应该false。虽然{2, 2, 5, 5, 5, 1, 7, 7, 7}应该提供true。这是我到目前为止,它应该true时打印false

public class testing1 {

  public static void main(String[] args){
    int [] x = {2, 2, 5, 5, 5, 1, 7, 7, 5, 7};
    System.out.println(isGrouped(x));

  }

  public static boolean isGrouped(int[] x){
    for(int i = 0; i < x.length; i++){
      for(int j = i + 1; j < x.length; j++){
        if(x[i] == x[j]) 
          return true;
      }
    }
    return false;
  }
}

4 个答案:

答案 0 :(得分:2)

您目前输出错误

for(int i = 0; i < x.length; i++){
  for(int j = i + 1; j < x.length; j++){
    if(x[i] == x[j]) 
      return true;
  }
}

在找到任何数字的连续出现后立即返回true(在您的情况下为2,2)。请注意,这将退出循环并且控件到达print语句,调用isGrouped方法将打印true

实际上,简而言之, 在这种情况下你不会遍历完整列表,除非列表中的所有数字都不同。

除此之外,您应该为遍历过的每个元素维护一个遍历元素列表或设置为true的标志。而且,你不会在那里需要嵌套循环。

答案 1 :(得分:2)

这里有一个如何实现算法的提示。

  1. 你需要循环遍历数组的所有元素/索引
  2. 对于每个元素,您必须测试是否允许元素出现在此索引处。
  3. 那么,什么时候允许元素出现?

    1. 如果它是数组的第一个元素,则允许它在那里
    2. 如果它等于前一个元素,则允许它在那里
    3. 如果它与前一个元素不同,并且这是第一次在数组中满足此值,则允许它在那里
    4. 否则,不允许在那里。

答案 2 :(得分:1)

您的代码不起作用,因为只要它找到两个相等的相邻值,它就会返回true。

一种解决方案是:

  • 从输入数组
  • 中删除连续重复项
  • 从输入数组中删除所有重复项(转换为set,然后再转换为数组)
  • 比较结果 - 如果两者相等,则返回true,否则返回

创建没有连续重复的新数组:

for (int i = 1; i < x.length; i++) {
    if (x[i-1] != x[i]) {
        newArr.add(x[i]);
    }
}

现在删除所有重复项:

Set<Integer> set = new HashSet<>();
for (int i = 0; i < x.length; i++){
    set.add(x[i]);
}
// create array from the set

并比较两者。

答案 3 :(得分:1)

如其他答案中所述,您的答案并未处理所有案件,因此不适用于多个案件。此外,这里不需要2个循环。如果第一次出现,您可以将已经看到的元素存储在哈希值和列表中的每个元素中。如果它没有第一次出现,如果前一个元素与此不相同,那么它应该是假的。

以下是代码:

public class testing1 {

  public static void main(String[] args){
    int [] x = {2, 2, 5, 5, 5, 1, 7, 7, 5, 7};
    System.out.println(isGrouped(x));
  }

  public static boolean isGrouped(int[] x){

      int prev = x[0] ;

    Hashtable<Integer, Integer> hashtable = 
              new Hashtable<Integer, Integer>();
    hashtable.put(x[0], 0);
    for (int i = 1 ; i < x.length ; i ++)
    {
        if (hashtable.get(x[i]) != null && prev == x[i]){
            hashtable.put(x[i], hashtable.get(x[i]) + 1);
        }

        else if (hashtable.get(x[i]) != null && prev != x[i]){
            return false;
        }

        else{
            hashtable.put(x[i], 0);
        }
        prev = x[i];
    }
    return true ;
    }

}

这也存储每个元素的出现次数。 希望这会有所帮助:)