【问题标题】:Extract less than 1% percentage values from a list从列表中提取小于 1% 的百分比值
【发布时间】:2021-03-27 21:23:36
【问题描述】:

我有一个DataModel pojo 类的列表。 percentage 字段为String 格式:

public class DataModel implements Serializable {
    private String percentage;

    public String getPercentage() {
        return this.percentage;
    }

    public void setPercentage(String percentage) {
        this.percentage = percentage;
    }
}

数据样本:

List<DataModel> list = new ArrayList();
DataModel d1 = new DataModel();
d1.setPercentage("20.34%");
DataModel d2 = new DataModel();
d2.setPercentage("30.04%");
DataModel d3 = new DataModel();
d3.setPercentage("10.34%");
DataModel d4 = new DataModel();
d4.setPercentage("0.34%");
list.add(d1);
list.add(d2);
list.add(d3);
list.add(d4);

我可以按以下相反的顺序对列表进行排序:

list = list.sort(comparing(r ->
        Double.parseDouble(
                r.getPercentage().substring(0, r.getPercentage().length() - 1)),
        Comparator.reverseOrder()));

List<DataModel> fullList = new ArrayList();
List<DataModel> lessList = new ArrayList();

我需要将上面的列表填写如下:

fullList ---> percentage > 1 (20.04%,20.34%,10.34%)
lessList ---> percentage < 1 (0.34%)

【问题讨论】:

    标签: java string list lambda java-8


    【解决方案1】:
    Map<Boolean, List<DataModel>> results = list.stream()
            .collect(Collectors.partitioningBy(
                    p -> p.getPercentage().startsWith("0.")));
    
    List<DataModel> fullList = results.get(false);
    List<DataModel> lessList = results.get(true);
    

    【讨论】:

      【解决方案2】:

      最好将 percentage 字段转换为 double 以便于比较它们并添加 toString 方法以保持视图相同。然后您可以轻松访问和表示所需的数据:

      public class DataModel implements Serializable {
          private double percentage;
      
          public DataModel(double percentage) {
              this.percentage = percentage;
          }
      
          public double getPercentage() {
              return percentage;
          }
      
          @Override
          public String toString() {
              return percentage + "%";
          }
      }
      
      public static void main(String[] args) {
          List<DataModel> list = List.of(
                  new DataModel(20.34),
                  new DataModel(30.04),
                  new DataModel(10.34),
                  new DataModel(0.34));
      
          System.out.println(list); // [20.34%, 30.04%, 10.34%, 0.34%]
      
          List<DataModel> fullList = list.stream()
                  .filter(dm -> dm.getPercentage() > 1)
                  .collect(Collectors.toList());
      
          System.out.println(fullList); // [20.34%, 30.04%, 10.34%]
      
          List<DataModel> lessList = list.stream()
                  .filter(dm -> dm.getPercentage() < 1)
                  .collect(Collectors.toList());
      
          System.out.println(lessList); // [0.34%]
      }
      

      另见:How to find duplicate elements in array in effective way?

      【讨论】:

        【解决方案3】:

        我建议您将该百分比用作双精度而不是字符串,以便您可以轻松比较它。 您还可以为该对象创建一个比较器类。你可以这样做:

        public class DataModelComparator implements Comparator<DataModel> {
            @Override
            public int compare(DataModel m1, DataModel m2) {
                return m1.getPercentage().compareTo(m2.getPercentage());
            }
        }
        

        因此,您可以在此处按百分比比较这些对象。 你可以像这样使用这个比较器:

        ArrayList<DataModel> models = new ArrayList<>();
        DataModel d1 = new DataModel(2.56);
        DataModel d2 = new DataModel(45.5);
        models.add(d1, d2);
        // now you have two objects created
        // so if you want to sort them by their
        // percentages you can do it like this:
        Collections.sort(models, new DataModelComparator());
        

        如果对象相等,比较器类将在内部发送 0,如果对象小于则发送 -1,如果对象大于则发送 1。

        在此之后,您的列表将按百分比排序,您可以通过一些 if 语句获取所需的数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-09
          • 1970-01-01
          • 2019-08-21
          • 1970-01-01
          • 2021-09-10
          • 2019-12-05
          • 1970-01-01
          相关资源
          最近更新 更多