【问题标题】:Java Arrays: Finding Unique Numbers In A Group of 10 Inputted NumbersJava 数组:在一组 10 个输入数字中查找唯一数字
【发布时间】:2015-09-08 02:52:02
【问题描述】:

我在这里不知所措。

我有这个家庭作业,我必须让用户输入 10 个数字,将它们放在一个数组中,并找出哪些输入的数字是唯一的。

这是我现在的工作流程:输入数字> 如果之前没有输入数字,则存储在数组中;如果之前输入过数字,忽略>显示输入的数字>显示唯一的数字

例如:输入 1 2 3 5 1 2 4 6 会找到唯一的数字并显示“1 2 3 4 5 6”

到目前为止,我的代码如下所示:

public class HwChapter6 {
    public static void main(String[] args) {
        java.util.Scanner input = new java.util.Scanner(System.in);

        int[] count = new int[10];
        int number = 0;
        int x = 0;
        boolean unique = false;
        int length = count.length;
        System.out.println("Insert 10 single digit numbers in any order your heart desires:");
        for (int i = 0; i < count.length; i++) {
            count[i] = input.nextInt();
            number = count[i];
            for (int j = 0; j < count.length; j++) {

感谢大家的帮助。

【问题讨论】:

  • 您违反了您的计划:“* 如果之前没有输入数字,则存储在数组中;*”。您将来自用户的任何内容存储在数组中。
  • 你需要做的是在存储到数组之前检查..如果(theValue不在数组中)那么我在这里向数组添加值

标签: java arrays


【解决方案1】:

将它们放入SetIntegers 中,而不是输入值数组。根据定义,集合仅存储唯一值。如果添加 3 个 'foo',则集合中将只有一个 'foo'。

// Add this to your top-level loop
Set<Integer> uniqueValues = new TreeSet<Integer>;
uniqueValues.add(number);

// Add this after the loop to write all unique values on one line
for (Integer value : uniqueValues) {
  System.out.print(value.toString() + " ");
}

// Now end the line.
System.out.println();

【讨论】:

  • 我不确定 OP 是否可以使用 Collection,因为他们可能还没有在课程中介绍它。
  • 这可能是完成这项任务的一种更有效的方法,但我仅限于使用数组。
【解决方案2】:

检查输入的数字,然后通过标记第二个(布尔)数组中的相同位置来跟踪哪些数字是唯一的,如果它们是唯一的,则使用true,否则使用false

然后,当您打印出唯一值时,仅在 numbers[] 中的每个位置包含 true 时打印该值。

Scanner input = new Scanner(System.in);
int[] numbers = new int[10];
boolean[] uniques = new boolean[10];

for(int i = 0; i < 10; i++) {
    System.out.println("Please enter a value: \n" + "[" + (i + 1) + "]: ");
    numbers[i] = input.nextInt();
    uniques[i] = true;
    for(int j = 0; j < 10; j++) {
        if(numbers[i] == numbers[j] && i != j) {
            uniques[i] = false;
        }
    }
}

System.out.println("\nThe numbers you entered were: \n");
for(int i = 0; i < 10; i++) {
    System.out.println(numbers[i] + ", ");
}
System.out.println("done.\n\n");

System.out.println("\nThe uniqe numbers you entered were: \n");
for(int i = 0; i < 10; i++) {
    if(uniques[i]) {
        System.out.println(numbers[i] + ", ");
    }
}
System.out.println("done.\n\n");

【讨论】:

    【解决方案3】:

    将所有数字存储在一个数组中。 对于每个存储的数字:检查之前是否插入了数字并将其保存在布尔数组中。 打印布尔数组中所有未标记的数字。

    java.util.Scanner input = new java.util.Scanner(System.in);
    
    int[] numbers = new int[10];
    boolean[] usedBefore = new boolean[10];
    
    // Insert all numbers
    for (int i = 0; i < numbers.length; i++) {
        // Read number from console
        numbers[i] = input.nextInt();
    
        // Check if number was inserted before
        usedBefore[i] = false;
        for(int k = 0; k < i; k++) {
            if(numbers[k] == numbers[i]) {
                usedBefore[i] = true;
                break;
            }
        }
    }
    
    // Print all numbers that were not inserted before
    for(int j = 0; j < numbers.length; j++) {
        if(!usedBefore[i]) {
            System.out.print(String.valueOf(numbers[j])+" ");
        }
    }
    

    【讨论】:

    • 这样可以完成工作,但它仍然记住相同值的多个实例。它还在每一行中打印出数组。我已经使用了 2 个 for 循环和一段时间,看起来像这样: for (int i = 0; i
    【解决方案4】:

    在所有其他操作完成后,最快、最简洁、最有效的方法是使用数组的第一个数字作为魔术值来破坏性地解析数组的唯一性:

    Scanner input = new Scanner(System.in);
    int magic = 0;
    int[] numbers = new int[10];
    
    for(int i = 0; i < 10; i++) {
        System.out.println("Please enter a value: \n" + "[" + (i + 1) + "]: ");
        numbers[i] = input.nextInt();
    }
    
    System.out.println("\nThe numbers you entered were: \n");
    for(int i = 0; i < 10; i++) {
        System.out.println(numbers[i] + ", ");
    }
    System.out.println("done.\n\n");
    
    System.out.println("The unique numbers are: ");
    magic = numbers[0];
    System.out.println(magic + ", ");
    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
            if(numbers[i] == numbers[j] && j != i) {
                numbers[j] = magic;
            }
        }
        if(numbers[i] != magic) {
            System.out.println(numbers[i] + ", ");
        }
    }
    System.out.println("done.\n\n");
    

    是的,我有两个答案 - 这个答案与另一个明显不同,而且更好,尽管初学者更难理解。然而,这两种解决方案都有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多