【问题标题】:Sorting Values based on ArrayList of Objects基于对象的 ArrayList 对值进行排序
【发布时间】:2017-09-17 10:18:14
【问题描述】:

我坚持比较价值观。数组列表由两个对象名称和百分比组成。

public class DataModel {

    private String name;
    private String dataUsagePercent;
     int color;
}

数组列表是

 List<DataModel> usageList;


 Collections.sort(usageList, new Comparator<DataModel>(){
        public int compare(DataModel d1, DataModel d2){

            return (d1.getDataUsagePercent()) - Integer.parseInt(d2.getDataUsagePercent()));
        }

    });

例子:

arraylist 中的 dataUsagePercent 值为 2, 10, 40, 30, 50, 60, 90, 65,55,100.

我必须比较dataUsagePercent 的值。最低的应该在数组列表和前四个类别中的第 0 位 构成 dataUsagePercent 的最高值。此外,其余六个值(构成使用百分比最低) 合并为一个百分比。

比较列表后上述值的输出应包括:

2,10+30+40+50+55+60,65,90,100 means 2, 245,65,90,100

最终列表大小应始终为 5,名称值没有影响

编辑:错过 60。添加到组合值

【问题讨论】:

  • 您可以创建另一个 ArrayList 并将所有百分比的副本放入其中,然后使用Collections.sort(arraylist)。然后抓取四个最高值和最低值,并将其余的相加。这是假设名称对百分比没有影响。
  • 您需要实现 Comparable 才能使用 Collections.sort
  • This?
  • 60 的值在哪里?它既不是作为直接值在最终列表中,也不是求和形成第 5 个值。
  • 错过了,现在补充

标签: java list sorting arraylist


【解决方案1】:

我认为您的列表数据类型需要更改为List&lt;DataUsageModel&gt; usageList; 要比较 dataUsagePercent 值,您可以使用 Collections.sort(usageList); 或者你可以使用priority queue

【讨论】:

    【解决方案2】:

    首先,按dataUsagePercent排序:

    usageList.sort(
        Comparator.comparing(
            DataModel::getDataUsagePercent, 
            Comparator.comparingInt(Integer::parseInt)));
    

    这里我使用List.sortComparator.comparing 方法。

    然后,我会使用一个通用的 for 循环来进行分组,同时处理索引:

    int[] topFive = new int[5];
    
    int size = usageList.size();
    for (int i = 0; i < size; i++) {
        int value = Integer.parseInt(usageList.get(i).getDataUsagePercent());
        if (i == 0) {
            topFive[0] = value; // lowest value at the beginning
        } else if (i > 0 && i < size - 3) {
            topFive[1] += value; // accumulate intermediate values in 2nd position
        } else {
            topFive[i - size + 5] = value; // top values in the last 3 positions
        }
    }
    

    输出为[2, 245, 65, 90, 100]

    【讨论】:

      【解决方案3】:

      首先我会对列表进行排序:

      Collections.sort(usageList, new Comparator<DataModel>(){
          public int compare(DataModel d1, DataModel d2){
              return Integer.compare(d1.getDataUsagePercent(), d2.getDataUsagePercent());
          }
      });
      
      • 之后,您可以只取第一个元素和最后 3 个元素。
      • 将中间值相加
      • 并创建您的结果数组

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        • 2018-04-21
        • 2015-10-06
        • 1970-01-01
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多