Java - 不重复地打印一个数字的出现次数

3

我正在尝试在提示用户输入后显示以下内容:

输入图像说明

这是目前的输入:

输入图像说明

可以看到,如果我重复输入一个数字,它会被列出两次。

你有什么建议?这是我的代码:

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

    ArrayList<Integer> Digits = new ArrayList<>();
    System.out.print("Enter digits: ");
    int value;

    do {
        value = input.nextInt();
        if (value > 1 && value < 101) 
            Digits.add(value);
        } while (value != 0);

    java.util.Collections.sort(Digits);
    Set<Integer> uniqueInputs = new HashSet<Integer>(Digits);
    for (int i = 0; i < Digits.size(); i++) {
        System.out.println(Digits.get(i) + " - " + Collections.frequency(Digits, Digits.get(i)) + " times");
    }

你已经接近成功了。你已经有了 uniqueInputs(目前从未使用)。现在你只需要遍历它并获取原始列表中其元素的频率。 - Amongalen
当读取数字时,您应该排除 1,将检查更改为 value >= 1 - Przemysław Głębocki
3个回答

1
你完成了,只需更改打印部分。
ArrayList<Integer> Digits = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 4, 2, 3,2));
java.util.Collections.sort(Digits);
Set<Integer> uniqueInputs = new HashSet<>(Digits);

// printing
uniqueInputs.forEach(digit-> System.out.println(digit + " - " + Collections.frequency(Digits, digit) + " times"));```

1
一个好的方法是使用 SortedMap。它会让你的代码更简单,提高性能。这样你就可以避免额外的集合和操作:
SortedMap<Integer, Integer> numbers = new TreeMap<>();
int value;

do {
    value = input.nextInt();
    if (value > 1 && value < 101) {
        numbers.put(value, numbers.getOrDefault(value, 0) + 1);
    }
} while (value != 0);

for (Map.Entry<Integer, Integer> number : numbers.entrySet()) {
    System.out.println(number.getKey() + " - " + number.getValue() + " times");
}

无关:按照惯例,在Java中变量名采用小驼峰命名法。


你的解决方案完美地运行了,除了输出会忽略1。有任何想法是为什么吗? - Ingrid Karina Førre
刚刚发现了我的错误!我把条件写成了value > 1,而不是value > 0。 - Ingrid Karina Førre

0
我会创建一组独特的数字,以避免重复计算多次。然后为每个数字计算频率,并将结果放入Map中。最后打印出结果。
List<Integer> digits = Arrays.asList(1, 2, 3, 4, 5, 4, 2, 3, 2);

Set<Integer> uniqueDigits = new HashSet<Integer>(digits);
Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>();
uniqueDigits.forEach(uniqueDigit -> frequencies.put(uniqueDigit, Collections.frequency(digits, uniqueDigit)));

// Printing
frequencies.keySet().forEach(key -> System.out.println(key + " - " + frequencies.get(key) + " times"));

非常感谢!这个方法有效,但是它在输出中无缘无故地忽略了1... 有什么想法吗? - Ingrid Karina Førre
2
刚刚发现我的错误!我把“value > 1”写成了“value > 0”。 - Ingrid Karina Førre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接