如何为每个循环打印一次,为阵列中的每个数字打印一次

时间:2016-11-12 22:34:36

标签: java arrays foreach

赋值: 编写一个程序,从用户读取1到100之间的整数并计算 每个号码的出现次数。用户输入在输入0时结束。 您必须使用增强的for循环来解决此问题。 如果一个数字出现超过1次,请使用复数字“times”而不是“time”。不要显示未输入的数字。

我知道并理解为什么我的代码的当前输出显示为重复。打印逻辑位于for-each循环代码块内。如果我关闭代码块,我将无法再使用在循环内初始化的变量。我已经尝试了我能想到的一切。任何建议将不胜感激

电流输出:
- 1发生一次, - 1发生2次 - 2次发生1次 - 2次发生2次 - 3次发生1次 - 3次发生2次

需要输出: - 1发生2次 - 2发生2次 - 3次发生2次

package com.company;
import java.util.Scanner;

public class Main {

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

    System.out.print("Enter Integers:");
    for (int i = 0; i < numbers.length; i++) {
        numbers[i] = in.nextInt();
        if (numbers[i] == 0) {
            break;
        }
    }
    enhancedLoop(numbers);
    }

    private static void enhancedLoop(int[] numbers) {
        int[] counts = new int[101];

        for (int value : numbers) {
            counts[value]++;

            if (value > 0)
                 if (counts[value]> 1)
                     System.out.println(value + " occurs " + counts[value]+ " times");
                 else
                     System.out.println(value + " occurs " + counts[value] + " time");

        }

}

4 个答案:

答案 0 :(得分:0)

     public class Main {
     public static void main(String[] args) {
      Scanner in = new Scanner(System.in);
      int[] numbers = new int[10];

    System.out.print("Enter Integers:");
    for (int i = 0; i < numbers.length; i++) {
        numbers[i] = in.nextInt();
        if (numbers[i] == 0) {
            break;
        }
    }
    enhancedLoop(numbers);


}

private static void enhancedLoop(int[] numbers) {
    int[] counts = new int[101];

    for (int value : numbers) {
        counts[value]++;

        if (value > 0)
            if (counts[value]> 1)
                System.out.println(value + " occurs " + counts[value]+ " times");

            else
                System.out.println(value + " occurs " + counts[value] + " time");

}

}

答案 1 :(得分:0)

变量仅在声明它们的块中可用。在for循环之后移动输出并迭代计数以显示值:

for (int i = 0, c = counts.length; i < c; ++i) {
    if (counts[i] > 0) {
        if (counts[i] > 1) {
            System.out.println(value + " occurs " + counts[i]+ " times");
        } else {
            System.out.println(value + " occurs " + counts[i]+ " time");
        }
    }
}

答案 2 :(得分:0)

您可以使用以下步骤有效地执行此操作:

(1)首先识别唯一编号

(2)查找每个唯一编号出现的次数

因此,您需要更改enhancedLoop(int[] numbers)方法,如下所示,以实现结果:

private static void enhancedLoop(int[] numbers) {

  //convert the array to a list to make computations easier by using streams
  List<Integer> numbersList = Arrays.stream(numbers).boxed().collect(Collectors.toList());

  //Get the unique numbers in the list
  List<Integer> uniqueNumbers = numbersList.stream().distinct().collect(Collectors.toList());

  //Now find out number of times each each unique number occured
  for(int number : uniqueNumbers) {
      long times = numbersList.stream().filter(num -> num == number).count();
      System.out.println(number+" occurs "+times);
    }
 }

答案 3 :(得分:0)

让我们尝试在没有lamdas的情况下执行此操作,只使用hashmap而不是array

import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        HashMap<Integer, Integer> numbers = new HashMap<Integer, Integer>();
        int tmp=0;
        System.out.print("Enter Integers:");

        //read a maximum of 10 int
        for (int i = 0; i < 10; i++) {
            tmp = in.nextInt();

            //if we read a 0 we quit
            if (tmp == 0) {
                break;
            }

            //if we already saw the number we up the counter
            if(numbers.containsKey(tmp)){
                numbers.put(tmp, numbers.get(tmp)+1);
            }else{
                //otherwise we just add the new int
                numbers.put(tmp, 1);
            }
        }

        //call the print loop
        enhancedLoop(numbers);
    }

    private static void enhancedLoop(HashMap<Integer, Integer> numbers) {
        //you print what you counted
        for(Map.Entry<Integer, Integer> entry : numbers.entrySet()) {
            System.out.print(entry.getKey() + " occurs " + entry.getValue() + " time");

        if (entry.getValue()>1)
            System.out.print("s");

        System.out.println("");
    }
}