【问题标题】:Android ArrayList sort by a templateAndroid ArrayList 按模板排序
【发布时间】:2014-10-31 17:10:32
【问题描述】:

我有一个 X 元素的数组列表。我想结束的情况是,如果某个元素存在,那么它将在列表中占据一定的优先级..例如,如果元素 1 出现在 arraylist 中,那么它将位于位置 0。但是,如果元素 1不存在,则元素 2 应位于位置 0。并非所有元素都会在应用程序的任何一次运行中出现。

当然,这些元素不称为 1,2,3...,而是复杂的字符串名称 - 没有普通的排序会起作用。排序列表的最佳方式是什么?有没有办法使用“理想排序列表”的模板?

为了让事情更清楚,让我们假设我的“理想”排序(如果所有可能的先例元素都存在的话)是:

狗 猫 兔子

但是要排序的数组列表是:

马 兔子 猫 猪

给出我想要从此特定应用运行中获得的顺序:

猫 兔子 马 猪

没有优先级的元素应该以任何顺序出现。

【问题讨论】:

  • 在您的列表中添加一个额外的整数字段优先级,并根据该优先级值进行排序。您可以为此使用 hashMap。
  • 非常感谢 - 我的最终解决方案是您的答案和 chiastic-security 的结合。我添加了一个包含键/值对的哈希图,其中键是字符串,值是优先级。然后我为每个对象(猫、马、狗等)添加了一个优先属性,并将优先映射传递给每个对象。如果对象的名称出现在哈希图中,那么我将密钥对的值复制到对象的优先级属性中。最后,我使用比较器按优先级对对象数组列表进行排序。
  • 很高兴知道您成功了。您能否为未来的访客发布您的答案。这将对社区有很大帮助。谢谢。

标签: android sorting arraylist


【解决方案1】:

在主类中:

private final Map<String,Integer> precedenceMap= new HashMap<String,Integer>();

//CREATE A PRECEDENCE MAP SO WE CAN SET THE ORDER OF ICONS IN THE ACTIVITY
precedenceMap.put("Cat",0);
precedenceMap.put("Dog",1);
precedenceMap.put("Horse",2);

在我们完成所有动物的设置后(并且它们都使用下面的逻辑通过了优先映射),对列表进行排序:

Collections.sort(AnimalList, new Comparator<Animal>() {
        public int compare(Animal result1, Animal result2) {
            return result1.getPrecedence()-result2.getPrecedence();
        }
    });

在 Animal 对象中:

private int precedence=99;
private Map<String,Integer> precedenceMap= new HashMap<String,Integer>();

并传入我们之前创建的优先级列表。如果动物对象的标签映射了优先映射中的某些内容,则将对象的优先级设置为映射中的值:

 if (precedenceMap.containsKey(label)) {
    precedence=precedenceMap.get(label);
 }

【讨论】:

    【解决方案2】:

    您可以使用Collections.sort 进行自定义排序。您需要编写一个自定义的Comparator 来比较两个元素并确定哪个更小(即哪个应该先出现)。然后您将您的列表和您的Comparator 传递给Collections.sort,它会根据您指定的顺序进行排序。

    更多详情见this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2015-11-16
      • 2017-12-16
      • 2011-01-30
      • 2019-02-20
      相关资源
      最近更新 更多