【问题标题】:Sorted list of elements within a collection集合中元素的排序列表
【发布时间】:2020-08-16 07:23:14
【问题描述】:

我正在查看与此线程同名的页面帮助:https://help.anylogic.com/index.jsp?topic=%2Fcom.anylogic.help%2Fhtml%2Fdata%2FSort_Collection.html

如页面所示,如果要按升序或降序对列表进行排序,请使用 sortAscending 或 sortDescending。在所包含的示例中,人员列表按年龄或时间以及其他时间按收入排序。

List sortedByAgeAsc = sortAscending( people, p -> p.age ); List sortedByIncomeDesc = sortDescending( people, p -> p.income );

如果我想同时按两个字段对列表进行排序怎么办?就像在这个人列表中一样,我想按收入升序和年龄降序排序,所以排序列表的第一个元素是收入最低的最年长的人。如果我一个接一个地运行它们,那么在运行第二个之后是相同的。我尝试在一个语句中使用 and 运算符,但是没有用

【问题讨论】:

标签: anylogic


【解决方案1】:

您需要使用 Java 比较器,例如参见 Sorting a list in Java using 2 criteria

这是一个在 AnyLogic 代码中实现比较器的示例,但仅使用 1 个条件。它将居住在 GIS 空间中的代理与特定位置 (getXYZ()) 进行比较:

ArrayList<MyAgent> listOfAgents= new ArrayList<MyAgent>(); 
// fill this with agents next

Collections.sort(listOfAgents, new Comparator<MyAgent>() {
    @Override
    public int compare(MyAgent agent1, MyAgent agent2) {
        return Double.compare(main.myGISNetwork.getDistance(agent1.getXYZ(), getXYZ()), main.myGISNetwork.getDistance(agent2.getXYZ(), getXYZ()));` 
    }
});

【讨论】:

    【解决方案2】:

    尝试先按收入排序,然后按年龄排序。对于所有年龄相同的代理人,他们将保持按收入排序。将最高优先级排序放在最后可能是违反直觉的,但它会给你想要的。

    List sortedByIncomeDesc = sortDescending( people, p -> p.income );
    List sortedByAgeAsc = sortAscending( people, p -> p.age );
    

    另一个技巧是给每个代理人打分,这样年龄就比收入更重要。存在一些风险,例如确保您的权重因子足够大以克服您的收入。我通常采用第一种方法,但如果您的数据具有 30.1 年和 30.2 年的年龄,也要小心。您可能需要进行一些四舍五入,将所有这些都算作 30 岁 - 取决于您的用例。

    List sortedByIncomeDesc = sortAscending( people, p -> p.age * 100000000 - p.income );
    

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 2022-11-04
      • 2012-01-16
      • 1970-01-01
      • 2013-03-23
      • 2018-05-08
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多