Java 如何让for each循环为数组中的每个数字打印一次

Java 如何让for each循环为数组中的每个数字打印一次,java,arrays,foreach,Java,Arrays,Foreach,任务: 编写一个程序,从用户处读取1到100之间的整数,并计算 每个数字的出现次数。当用户输入0时,用户输入结束。 必须使用增强的for循环来解决此问题。 如果一个数字出现超过1次,用复数“times”代替“time”。不要显示未输入的数字 我知道并理解为什么我的代码在下面的当前输出中出现了重复项。打印逻辑位于for each循环代码块内。如果关闭代码块,我将无法再使用在循环中初始化的变量。我已经尝试了我能想到的一切。如有任何建议,将不胜感激 电流输出: -1发生1次, -1发生2次 -2发生1

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

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

电流输出:
-1发生1次, -1发生2次 -2发生1次 -2出现2次
-3发生1次
-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");

        }
所需产出: -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");

        }
package.com公司;
导入java.util.Scanner;
公共班机{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
整数[]个数=新整数[10];
System.out.print(“输入整数:”);
for(int i=0;i0)
如果(计数[值]>1)
System.out.println(值+“发生”+计数[值]+“次数”);
其他的
System.out.println(值+“发生”+计数[值]+“时间”);
}
}

公共类主目录{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
整数[]个数=新整数[10];
System.out.print(“输入整数:”);
for(int i=0;i0)
如果(计数[值]>1)
System.out.println(值+“发生”+计数[值]+“次数”);
其他的
System.out.println(值+“发生”+计数[值]+“时间”);
}

}

变量仅在声明它们的块中可用。将输出移动到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");
        }
    }
}
for(int i=0,c=counts.length;i0){
如果(计数[i]>1){
System.out.println(值+“发生”+计数[i]+“次数”);
}否则{
System.out.println(值+“发生”+计数[i]+“时间”);
}
}
}

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

(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);
    }
 }
private static void enhancedLoop(int[]数字){
//将数组转换为列表,以便使用流简化计算
List numbersList=Arrays.stream(numbers).boxed().collect(Collectors.toList());
//获取列表中的唯一编号
List uniqueNumbers=numbersList.stream().distinct().collect(Collectors.toList());
//现在找出每个唯一数字出现的次数
for(整数:唯一数){
longtimes=numbersList.stream().filter(num->num==number.count();
System.out.println(数字+发生次数+次数);
}
}

让我们在没有lamdas的情况下尝试这样做,只需使用hashmap而不是数组

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("");
    }
}
import java.util.Scanner;
导入java.util.HashMap;
导入java.util.Map;
公共班机{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
HashMap number=新的HashMap();
int-tmp=0;
System.out.print(“输入整数:”);
//读取的最大值为10整数
对于(int i=0;i<10;i++){
tmp=in.nextInt();
//如果我们读到0,我们就退出
如果(tmp==0){
打破
}
//如果我们已经看到了号码,我们就到柜台上去
if(数字容器(tmp)){
numbers.put(tmp,numbers.get(tmp)+1);
}否则{
//否则我们只需添加新的int
数字。put(tmp,1);
}
}
//调用打印循环
enhancedLoop(数字);
}
私有静态void enhancedLoop(HashMap编号){
//你把你数的打印出来
for(Map.Entry:numbers.entrySet()){
System.out.print(entry.getKey()+“发生”+entry.getValue()+“时间”);
if(entry.getValue()>1)
系统输出打印(“s”);
System.out.println(“”);
}
}

感谢Tahar的回复,他只使用了数组sinc分配调用它:编写一个程序,从用户那里读入一个介于1和100之间的整数数组,并计算每个数字的出现次数。当用户输入0时,用户输入结束。您必须使用增强的for循环来解决此问题。这太麻烦了,我很抱歉,我的第一个SO帖子,有一些病态哭泣的孩子。我感谢你花时间去看它。如果它有帮助,太好了,你可以接受/赞成答案