【问题标题】:How to loop through an array and check for duplicates?如何遍历数组并检查重复项?
【发布时间】:2013-11-03 02:39:42
【问题描述】:

我正在创建一个程序,可让您将 10 个项目存储在一个数组中。如果输入的项目之一已经存在于数组中,我无法让程序做的是给出一个错误。

因此,例如,如果数组看起来像 [banana, potato, 3, 4, yes, ...] 并且我再次输入香蕉,它应该说“项目已被存储”并要求我重新-输入值。我目前拥有的代码是:

public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int stringNumber = 0;
        String[] stringArray = new String[10];

        for (int i = 0; i <= stringArray.length; i++) {

            out.println("\nEnter a string");
            String input = keyboard.next();
            stringArray[stringNumber] = input;
            out.println("\"" + stringArray[stringNumber] + "\"" + " has been stored.");

            PrintArray(stringArray);
            stringNumber++;

【问题讨论】:

  • 我不明白这个问题。究竟是什么阻止您遍历数组并检查重复项?
  • 缺少一些代码
  • 将它们添加到集合中,如果它已经存在,则不允许您这样做。最后转换为数组(你真的需要一个数组吗?)
  • 不要自己写printArray-方法。使用System.out.println(Arrays.toString(stringArray));
  • lngo,问题是我不知道如何循环遍历数组,看看输入的字符串值是否已经存在。 (我是初学者)

标签: java arrays loops


【解决方案1】:

您可以使用嵌套循环遍历数组以查看新输入是否存在。最好在函数中执行此操作。此外,在执行此操作时,您需要确保您不在第一个元素处,否则您将获得空指针异常。

for (int i = 0; i <= stringArray.length; i++) {

        boolean isInArray = false;

        System.out.println("\nEnter a string");
        String input = keyboard.next();

        if (i > 0) {

            for (int j = 0; j < stringArray.length; j++) {
                if (stringArray[j].equalsIgnoreCase(input)) {
                    isInArray = true;
                    break;
                }
            }
        }
        if (!isInArray) {
            stringArray[stringNumber] = input;
        } else {
            System.out.println("\"" + stringArray[stringNumber-1] + "\""
                    + " has been stored.");
        }
        PrintArray(stringArray);
        stringNumber++;
    }

【讨论】:

  • 我只使用了循环和数组,假设这是用于学校作业并且您不能使用其他数据类型。
  • 这段代码有一个小错误,但我正在努力修复它!谢谢马特,这让我对我应该在这个程序中采取的方向有了更好的看法。 :)
【解决方案2】:

当您不想存储重复项时,最好使用HashSet。然后使用HashSet#contains() 方法检查元素是否已经存在。如果订购很重要,请使用LinkedHashSet


如果你真的想使用一个数组,你可以为一个数组写一个实用方法contains()。传递数组和要搜索的值。

public static boolean contains(String[] array, String value) {
    // Iterate over the array using for loop
    // For each string, check if it equals to value.
    // Return true, if it is equal, else continue iteration
    // After the iteration ends, directly return false.
}

【讨论】:

    【解决方案3】:

    当你得到字符串输入后,你可以创建一个方法:

    1. 遍历整个数组并检查字符串是否在其中(您可以使用equals()检查字符串的内容)
    2. 返回一个布尔值,无论字符串是否在数组中
    3. 然后只需添加一个 while 结构来重新请求输入

    基本上可以是这样的:

    String input = "";    
    do {
        input = keyboard.next();
    }while(!checkString(input))
    

    checkString 方法将遍历所有数组(使用 for 循环,就像添加元素一样)并返回适当的 boolean 值。


    【讨论】:

    • 这正是我认为我应该做的。问题是我已经使用 Java 2 天了,我不知道如何编写那段代码:(
    【解决方案4】:

    如果不在数组中引入一些顺序并且不使用 HashSet 等附加结构,您将不得不查看整个数组并将新项与数组中已经存在的每个项进行比较。

    对我来说,最好的解决方案是使用一个帮助程序 HashSet 来检查项目是否存在。

    也可以看看this question

    【讨论】:

      【解决方案5】:

      为避免您应该使用 Set 而不是数组并循环直到 size = 10。

      如果需要保留一个数组,可以使用.contains()方法来检查该项目是否已经存在于数组中。

      【讨论】:

        【解决方案6】:
        while (no input or duplicated){
             ask for a new string
             if (not duplicated) {
                  store the string in the array
                  break;
             }
        }
        

        【讨论】:

          【解决方案7】:

          在插入数组之前,您应该检查数组中的输入值。您可以编写一个类似exists 的方法,它接受String[]String 作为输入参数,并在String 数组中找到该字符串,如果找到结果则返回true 否则返回false

          public boolean exists(String[] strs, String search){
              for(String str : strs){
                  if(str.equals(search))
                     return true;
              }
              return false;
          }
          

          线性搜索时性能为 O(n)。

          【讨论】:

            猜你喜欢
            • 2013-04-20
            • 1970-01-01
            • 2011-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-14
            • 1970-01-01
            相关资源
            最近更新 更多