我正在添加用户输入的几个数字,并将它们添加到数组列表中。
到目前为止我的代码:
package project143;
import java.util.*;
/**
* @author --
*/
public class Histogram {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// Input for grades
int mark = 0;
List<Integer> list = new ArrayList<Integer>();
while (mark >= 0 && mark <= 100) {
System.out.println("Enter students mark:");
mark = input.nextInt();
if (mark >= 0 && mark <= 100) {
list.add(mark);
}
}
System.out.println(list);
}
}
现在,我需要计算list
中有多少数字在以下范围内(0-29,30-39,40-69,70-100)
一旦我知道每个范围内有多少个数字,我需要在每个范围旁边显示“”,例如,在0到29范围内有10个数字,因此我需要显示10颗星(的 的 ** * )。
我怎样才能做到这一点?
答案 0 :(得分:6)
如果您使用Eclipse Collections,则可以编写以下代码。首先,我们设置您指定的范围:
private ImmutableList<Interval> ranges = Lists.immutable.with(
Interval.fromTo(0, 29),
Interval.fromTo(30, 39),
Interval.fromTo(40, 69),
Interval.fromTo(70, 100));
然后我们可以使用匿名内部类在示例中使用这些范围。
final MutableBag<Interval> countByRange = Bags.mutable.empty();
Interval inputs = Interval.from(5).to(100).by(5);
inputs.forEach(new IntProcedure()
{
public void value(final int grade)
{
countByRange.add(ranges.detect(new Predicate<Interval>()
{
public boolean accept(Interval range)
{
return range.contains(grade);
}
}));
}
});
countByRange.forEachWithOccurrences(new ObjectIntProcedure<Interval>()
{
public void value(Interval range, int occurrences)
{
System.out.println(range + " : " + StringIterate.repeat('*', occurrences));
}
});
您需要将Interval输入替换为实际输入(在您的示例中为Scanner)。我只想要一组简单的输入来测试。
代码的输出如下:
Interval from: 70 to: 100 step: 1 size: 31 : *******
Interval from: 40 to: 69 step: 1 size: 30 : ******
Interval from: 30 to: 39 step: 1 size: 10 : **
Interval from: 0 to: 29 step: 1 size: 30 : *****
使用Java 8 Lambda语法,您可以编写以下内容:
MutableBag<Interval> countByRange = Bags.mutable.empty();
Interval inputs = Interval.from(5).to(100).by(5);
inputs.forEach((int grade) -> {
countByRange.add(ranges.detect(range -> range.contains(grade)));
});
countByRange.forEachWithOccurrences((range, occurrences) ->
{System.out.println(range + " : " + StringIterate.repeat('*', occurrences));});
如果您想尝试使用collect而不是使用forEach添加到包中,以下代码会产生相同的结果。
Interval.from(5).to(100).by(5)
.collect(grade -> ranges.detect(range -> range.contains(grade)))
.toBag()
.forEachWithOccurrences((range, occurrences) ->
{System.out.println(range + " : " + StringIterate.repeat('*', occurrences));});
注意:我是Eclipse集合的提交者。
答案 1 :(得分:1)
使用3个变量进行计数。当您将标记添加到列表时,会根据条件增加变量。最后使用计数变量打印开始。
答案 2 :(得分:0)
你可以这样做,没有列表,把这个代码放在你从...输入的循环中。
if (mark <= 29) ++bombout;
else if (mark <= 39) ++fail;
else if (mark <= 69) ++pass;
else ++excellent;
...或者如果你想使用List,迭代它并将上面的代码放在循环中。
答案 3 :(得分:0)
- 使用4个int
变量来存储4个范围。
<强>例如强>
int range29;
int range39;
int range69;
int range100;
- Loop
通过List
到计算不同范围内的条目数。
<强>例如强>
for(int i : list){
if ( i>=0 & i<=29){ // better use Non-short circuit AND
++range29;
}
else if ( i>=30 & i<=39){ // better use Non-short circuit AND
++range39;
}
else if ( i>=40 & i<=69){ // better use Non-short circuit AND
++range69;
}
else if ( i>=70 & i<=100){ // better use Non-short circuit AND
++range100;
}
}
- 现在只需使用for-loop
根据范围变量打印星数。