繁体   English   中英

如何在每个 if 语句后重置数组?

[英]How to reset an array after each if statement?

我有一个我正在编写的 Java 程序,其中用户输入 20 个数字并将其存储在一个数组中。 然后打印一个直方图,说明一个数字输入了多少次:

1-10 |*********

11-20 |*****

21-30 |**

31-40 |**

41-50 |**

这是我的代码:

 String asterisk1 = "";
        String asterisk2 = "";
        String asterisk3 = "";
        String asterisk4 = "";
        String asterisk5 = "";
        System.out.println("Histogram: ");
        System.out.println(" ");
        for (int i = 0; i <= f.length-1; i++)
        {
           
          
            if (f[i] >= 1 && f[i] <= 10)
            {
                asterisk1 += "*";
            }
            if (f[i] >= 11 && f[i] <= 20)
            {
                asterisk2 += "*";
            }
            if (f[i] >= 21 && f[i] <= 30)
            {
                asterisk3 += "*";
            }
            if (f[i] >= 31 && f[i] <= 40)
            {
                asterisk4 += "*";
            }
            if (f[i] >= 41 && f[i] <= 50)
            {
                asterisk5 += "*";
            }
        }
       
        System.out.println(" 1-10 |"+ asterisk1);
        System.out.println("11-20 |"+ asterisk2);
        System.out.println("21-30 |"+ asterisk3);
        System.out.println("31-40 |"+ asterisk4);
        System.out.println("41-50 |"+ asterisk5);
    }
    
}

因此,我没有声明每个变量,而是尝试创建一个数组。 但问题是我很困惑如何将数组重置为 0,所以我得到了正确数量的星号。 我试着只做String asterisk [] = new String[50]; 在 if 循环中,我只会做asterisk[i] += "*"什么建议吗?

asterisk[i] += "*"这里i是你数据的索引,意思是f的索引,但它应该是范围的索引,直接指定像asterisk[0] , asterisk[1] ...

 if (f[i] >= 1 && f[i] <= 10) {
    asterisk[0] += "*";
 }
 if (f[i] >= 11 && f[i] <= 20) {
    asterisk[1] += "*";
 }
 ...

或者您可以动态地为您的条件使用嵌套循环

for (int i = 0; i <= f.length-1; i++) {
     for(int j = 0; j < 5; j++) {
         if (f[i] >= (j*10 +1) && f[i] <= (j+1)*10) {
             asterisk[j] += "*";
         }
     }
}

我不知道你说的什么意思

如何将数组重置为 0

但在这里我做了一个小例子,说明如果您使用 String 数组而不是五个变量,您的程序会是什么样子:

public class HelloWorld {

     public static void main(String []args){
         String[] asterisks = new String[5];  // set the size you want here
         int[] f = { 0, 40, 52, 12, 31, 12, 42, 23, 5, 13, 42, 45, 25, 26, 27, };

        // initialize every "space" of the array
        for (int i=0; i<asterisks.length; i++) {
            asterisks[i] = "";
        }

        // do exactly what your code did before, but with an Array
        for (int i=0; i<f.length; i++) {
            if (f[i] >= 1 && f[i] <= 10) {
                asterisks[0] += "*";
            } else if (f[i] >= 11 && f[i] <= 20) {
                asterisks[1] += "*";
            } else if (f[i] >= 21 && f[i] <= 30) {
                asterisks[2] += "*";
            } else if (f[i] >= 31 && f[i] <= 40) {
                asterisks[3] += "*";
            } else if (f[i] >= 41 && f[i] <= 50) {
                asterisks[4] += "*";
            }
        }

        System.out.println(" 1-10 |"+ asterisks[0]);
        System.out.println("11-20 |"+ asterisks[1]);
        System.out.println("21-30 |"+ asterisks[2]);
        System.out.println("31-40 |"+ asterisks[3]);
        System.out.println("41-50 |"+ asterisks[4]);

    }
}

也许您想使用 Hash 使其更具动态性,我的意思是:您可能不知道直方图将有多少列,因此您可以制作一个与范围值(“21-30”、“31”)相关的 Hash -40"、"41-50" 等...) 到字符串数组上的位置。 如果你决定按照我的建议你不能做最后一个“System.out.println”,你应该首先为每个哈希键,然后打印与每个哈希键相关的字符串数组位置。

对不起,如果我写错了,英语不是我的母语。 我希望我的示例对您了解数组的工作原理有所帮助。

使用 Stream API 的示例:

  • 将数组的每个元素映射到某个范围
  • 按范围对元素进行分组并计算数组中每个元素的频率
  • 构建一个包含适当数量星号的直方图列
  1. 定义一个函数来为给定的整数值生成范围0_1011_20等:
private static String buildRange(int x) {
    int ten = (x - 1) / 10 * 10; // correction to include multiple of 10 to "previous" range 
    return String.valueOf((x > 10 ? 1 : 0) + ten) + "_" + String.valueOf(10 + ten);
}
  1. 将数组转换为频率图。
    地图可以用不同的方式按范围排序:对于这个例子,可以使用TreeMap
Arrays.stream(f)
      .boxed() // convert IntStream to Stream<Integer> to work with collectors
      .collect(Collectors.toMap( // build frequency map as Map<String, Integer>
              MyClass::buildRange, x -> 1, Integer::sum, TreeMap::new
      ))
      .entrySet().forEach(MyClass::printEntry);
  1. 实现将条目打印为直方图列的方法:
private static void printEntry(Map.Entry<String, Integer> entry) {
    System.out.printf("%5s | %s%n", 
            entry.getKey(), 
            String.join("", Collections.nCopies(entry.getValue(), "*")) 
            // or "*".repeat(entry.getValue()) for JDK 11+
    );
}

输出
对于输入int[] f = { 0, 40, 52, 12, 31, 12, 42, 23, 5, 13, 42, 45, 25, 26, 27, };

 0_10 | **
11_20 | ***
21_30 | ****
31_40 | **
41_50 | ***
51_60 | *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM