2

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

到目前为止我的代码:

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 个星(** *)。

我怎样才能做到这一点?

4

4 回答 4

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 集合的提交者。

于 2012-12-05T16:26:15.890 回答
1

使用 3 个变量进行计数。在添加标记以列出时,根据条件增加变量。最后使用该计数变量打印开始。

于 2012-12-02T14:30:33.577 回答
0

您可以通过将此代码放入您从中获取输入的循环中来在没有列表的情况下执行此操作...

 if (mark <= 29) ++bombout;
 else if (mark <= 39) ++fail;
 else if (mark <= 69) ++pass;
 else ++excellent;

...或者如果您想使用列表,请对其进行迭代并将上面的代码放入循环中。

于 2012-12-02T14:29:39.450 回答
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;
    }


}

-现在只需使用 a根据范围变量for-loop打印星数。

于 2012-12-02T14:40:06.207 回答