gpt4 book ai didi

java - 统计 ArrayList 中一定范围内的数字

转载 作者:行者123 更新时间:2023-12-03 23:08:27 29 4
gpt4 key购买 nike

我正在添加用户输入的几个数字并将它们添加到数组列表中。

到目前为止我的代码:

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);
}
}

现在,我需要计算列表中有多少数字在以下范围内(0-29、30-39、40-69、70-100)

一旦我知道每个范围内有多少个数字,我需要在每个范围旁边显示“”,例如在 0 - 29 范围内有 10 个数字,因此我需要显示 10 个星(***)。

我怎样才能做到这一点?

最佳答案

如果您使用 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 集合的提交者。

关于java - 统计 ArrayList 中一定范围内的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670160/

29 4 0