[英]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 的示例:
0_10
、 11_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);
}
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);
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.