【问题标题】:Count Range in ArrayList that are within a specific range计算 ArrayList 中特定范围内的范围
【发布时间】:2014-04-05 15:00:00
【问题描述】:

所以我有一个用户输入的从 0% 到 100% 标记的 ArrayList,我需要计算 Level R、Level 1、Level 2、Level 3、Level 4 的数量。

例如: [30、45、60、65、72、78、85、87、95]

R 级数(标记

第 1 级的数字(标记 >= 50 && 标记

第 2 级的数字(标记 >= 60 && 标记

第 3 级的数字(标记 >= 70 && 标记

4 级数(标记 >= 80):3

我不确定如何计算 ArrayList 中的特定范围。初级程序员...

谢谢!

【问题讨论】:

  • 使用 switch 语句进行计数。
  • 这是一个非常简单的list iteration
  • 到目前为止你尝试了什么?
  • [30, 45, 60, 65, 72, 78, 85, 87, 95] 只是一个例子。我实际上有一个用户在向程序提交标记时添加的 ArrayList。我只是一个初级程序员。
  • 我的数组列表是“等级”,它是所有的 inputBox.getText() 到一个数组列表中

标签: java loops if-statement arraylist


【解决方案1】:

这是一个基本的实现。

int[] dataSet = {30, 45, 60, 65, 72, 78, 85, 87, 95};
int levelR = 0, levelOne = 0, levelTwo = 0, levelThree = 0, levelFour = 0;

for(int mark : dataSet) {
    if(mark >= 80)
        levelFour++;
    else if(mark >= 70 && mark < 80)
        levelThree++;
    else if(mark >= 60 && mark < 70)
        levelTwo++;
    else if(mark >= 50)
        levelOne++;
    else
        levelR++;

}
System.out.println(levelR + ":" + levelOne + ":" + levelTwo + ":" + levelThree + ":" + levelFour);

【讨论】:

    【解决方案2】:

    使用简单的 switch 语句。试试这个,

    public static void main(String[] args) {
        int arr[] = {30, 45, 60, 65, 72, 78, 85, 87, 95};
        int res[] = new int[5];
    
        for (int num : arr) {
            int division = num / 10;
            switch (division) {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                    res[0]++;
                    break;
                case 5:
                case 6:
                case 7:
                    res[division - 4]++;
                    break;
                case 8:
                case 9:
                    res[4]++;
                    break;
            }
        }
        for (int i = 0; i < res.length; i++) {
            if (i == 0) {
                System.out.println("Number at level R : " + res[0]);
            } else {
                System.out.println("Number at level " + i + " : " + res[i]);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:
      public static void main( String[] args ) {
      
          Integer[] marks = new Integer[] { 30, 45, 60, 65, 72, 78, 85, 87, 95 };
          Map<Integer[], Integer> levelNumberMap = new HashMap<Integer[], Integer>();
          levelNumberMap.put( new Integer[] { 50, 60 }, 0 );
          levelNumberMap.put( new Integer[] { 60, 70 }, 0 );
          levelNumberMap.put( new Integer[] { 70, 80 }, 0 );
          levelNumberMap.put( new Integer[] { 80 }, 0 );
      
          for( Integer[] level : levelNumberMap.keySet() ) {
              int count = 0;
              if( level.length == 2 ) {
                  int lower = level[0];
                  int upper = level[1];
      
                  for( int mark : marks ) {
                      if( mark >= lower && mark < upper ) {
                          count++;
                      }
                  }
              } else if( level.length == 1 ) {
                  int lower = level[0];
                  for( int mark : marks ) {
                      if( mark >= lower ) {
                          count++;
                      }
                  }
              }
              levelNumberMap.put( level, count );
          }
      
          // sample print out
          for( Integer[] level : levelNumberMap.keySet() ) {
              System.out.println( "Level " + Arrays.asList( level ) + " number: "
                      + levelNumberMap.get( level ) );
          }
      }
      

      您总是可以在 levelNumberMap 中设置更多限制,而不必担心更改逻辑。 改进 虽然我使用整数数组作为映射的键,但您可以创建一个自定义类,并确保实现 equals 和 hashcode 方法。

      【讨论】:

        【解决方案4】:

        使用 Guava Range 和 Collections2.filter。像这样:

        final List<Integer> list = Lists.newArrayList(30, 45, 60, 65, 72, 78, 85, 87, 95);
        
        System.out.println("Level R: " + Collections2.filter(list, Range.closed(1, 50)).size() + " Level 1: "
                    + Collections2.filter(list, Range.closedOpen(50, 60)).size() + " Level 2: "
                    + Collections2.filter(list, Range.closedOpen(60, 70)).size() + " Level 3: "
                    + Collections2.filter(list, Range.closedOpen(70, 80)).size() + " Level 4: "
                    + Collections2.filter(list, Range.greaterThan(79)).size());
        

        【讨论】:

          猜你喜欢
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多