【问题标题】:Java, Return true if array contains duplicate valuesJava,如果数组包含重复值,则返回 true
【发布时间】:2013-07-21 15:39:58
【问题描述】:

如果一个名为 x 的给定数组(由用户在另一个方法中输入)包含重复值,我试图让一个方法(重复项)返回 true。否则它会返回假。它不会检查初始化为 100 的整个数组,而是只检查输入的值的数量,并使用全局计数器跟踪:numElementsInX。

最好的方法是什么?

public static boolean duplicates (int [] x)

我提示用户数据如下:

public static void readData (int [] x, int i){

    Scanner input = new Scanner(System.in);
    System.out.println("Please enter integers, enter -999 to stop");

    while (i <= 99) {
        int temp = input.nextInt();
            if(temp == -999){
                break;
            }
            else {
                x[i++]=temp;
            }

    // else

}//end while
        printArray(x,i);


}//end readData

public static void printArray(int [] x, int numElementsInX){

int n = numElementsInX;

for (int i = 0; i < n; i++){
    System.out.print(x[i] + " ");


}//end for
        System.out.println();
}//end printArray

我确信有更好的方法来做到这一点,但这是迄今为止我被教导的方式。

【问题讨论】:

  • 你的意思是numElementsInX 是在x 中没有重复元素的情况下的元素数量吗?
  • 编辑:抱歉,它是一个全局计数器。不,它是数组中输入值的数量。用户最多可以输入 100 个值。返回 array.length 给出整个初始化数组,而不是只输入正确的值?

标签: java arrays sorting boolean jgrasp


【解决方案1】:

对于java,如果数组包含重复值,则返回true,


boolean containsDuplicates(int[] a) {
    
    HashSet<Integer> hs = new HashSet<>();
    
    for(int i = 0; i<a.length; i++) {
        if(!hs.add(a[i])){
            return true;
        }  
    }   
    return false;
}

【讨论】:

    【解决方案2】:

    "set.add()" 如果元素不在集合中,则返回 true,否则返回 false。我们可以利用它并像上面的解决方案一样摆脱“set.contains()”。

    public static boolean duplicates (int[] x, int numElementsInX) {
        Set<Integer> myset = new HashSet<>();
        for (int i = 0; i < numElementsInX; i++) {
            if (!myset.add(x[i])) {
                return true;
            }
        }
        return false;
    }
    

    【讨论】:

      【解决方案3】:

      这当然不是最有效的方法,但由于您还不知道Sets,您可以使用两个循环:

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

      【讨论】:

      • 这假设一个有序数组不是吗?
      • 否 - 它将每个元素与其他元素进行比较。它不需要额外的空间,但在最坏的情况下它的时间是 O(n^2)。
      【解决方案4】:

      这是一个解决方案:

      • 编译和执行不抛出异常。
      • 按照您的要求使用numElementsInX
      • 一发现重复就返回。

      这种方法测试数组的每个成员是否以前都见过。如果有,该方法可以立即返回。如果没有,则将该成员添加到之前看到的集合中。

      public static boolean duplicates (int [] x, int numElementsInX ) {
          Set<Integer> set = new HashSet<Integer>();
          for ( int i = 0; i < numElementsInX; ++i ) {
              if ( set.contains( x[i])) {
                  return true;
              }
              else {
                  set.add(x[i]);
              }
          }
          return false;
      }
      

      这是sample program containing the above code

      【讨论】:

        【解决方案5】:

        应该这样做。

        public boolean containsDuplicates(Integer[] x) {
           return new HashSet<Integer>(Arrays.asList(x)).size() != x.length
        }
        

        你不需要 numElementsInX 因为这与 x.length 相同

        编辑来自 Louis 的评论。 Arrays.asList 不适用于 int 数组。

        要将 int[] 转换为 Integer,请尝试这个问题 How to convert int[] to Integer[] in Java?

        或做这样的事情(未经测试,但凭记忆)

        Integer[] newArray = new Integer[a.length];
        System.arraycopy(a, 0, newArray, 0, a.length);
        

        【讨论】:

        • 将只比较输入的值的数量,而不是数组的整个初始化长度。因此计数器?它超出了我的范围,但我试着把它分开谢谢!
        • 首先要了解Sets 不允许重复元素并从那里开始。
        • -1。 Arrays.asList 不像您期望的那样工作 int[]。这实际上不起作用。
        • 我只是很困惑,因为我的教授告诉我 array.length 将返回整个初始化的 100 数组,而不仅仅是用户输入的内容。我将发布我如何提示输入数组数据。
        • @user2210274 如果您想查询自己设置的值的数量,请在每次添加值时使用并增加您自己的计数器。或者更好的是,使用List 的实现。
        猜你喜欢
        • 2014-02-04
        • 2017-02-06
        • 2021-08-26
        • 2018-01-04
        • 1970-01-01
        • 2021-09-15
        • 2015-05-09
        • 2021-03-23
        • 1970-01-01
        相关资源
        最近更新 更多