【问题标题】:Java Set - how to sort based on a list of namesJava Set - 如何根据名称列表进行排序
【发布时间】:2015-02-18 22:07:30
【问题描述】:

我有一个 java Set,但我无法将其更改为 TreeSet,尽管我可以将其复制过来。问题来了:

我有名字,塔,汽车,建筑物,办公室,地下室。我有一个 POJO,它有一个字符串标签变量,每个实例都包含其中一个。

我怎样才能将这些排序为塔、汽车、建筑物、办公室、地下室的确切顺序。当然不允许重复(它是一组)。

public class Places{

String label;
int moreinfo;
}

所以想象一下我有 10 个 Places 对象,其标签可能是塔楼、汽车、建筑物、办公室、地下室中的任何一个:我怎样才能将它们归为一组,以确保它们按照“塔楼、汽车、建筑物、办公室、地下室”?

【问题讨论】:

  • 修改Places实现Comparable<Places>

标签: java sorting collections set


【解决方案1】:

您可以使用 Map 为任意一组字符串定义顺序:

private static Map<String, Integer> ordering;
static {
    ordering = new HashMap<>();
    ordering.add("tower", 1);
    ordering.add("car", 2");
    ...add your other strings with increasing values...
}

Collections.sort(yourCollection, new Comparator<Places>() {
    public int compare(Places p1, Places p2) {
        return ordering.get(p1.label) - ordering.get(p2.label);
    }
});

但是要小心……你不能对 Set 进行排序。如果它是一个 SortedSet(如 TreeSet),它会自行排序,如果不是,它没有定义的顺序。

【讨论】:

  • PS 当然,如果您使用的是 Java 8,您可以使用 lambda 来创建比较器
  • 感谢@JeffreyBosboom,已修复。
【解决方案2】:

您可以将字段“标签”转换为枚举,其中枚举值按您的自定义顺序排序。

public enum Label {
    TOWER, CAR, BUILDING, OFFICE, BASEMENT
}

然后,您可以实现一个可比较的方法来对集合进行排序。

class Places implements Comparable<Places>{

    Label label;
    int moreinfo;
    @Override
    public int compareTo(Places o) {
        return label.compareTo(o.label);
    }   
}

然后您可以使用 Collections.sort 方法进行排序。

【讨论】:

  • 创造性的答案,但我不能改变我的实现。标签是我的代码中的字符串。加一。
猜你喜欢
  • 2015-07-30
  • 2022-08-19
  • 2021-11-18
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多