java list如何指定元素排在最前面?

    public static void main(String[] args) throws InterruptedException {
        String fund = "450,460,470,480";
        ArrayList<String> list = new ArrayList<>();
        list.add("480");
        list.add("485");
        list.add("450");
        list.add("481");
        list.add("460");
        list.add("366");
        list.add("470");
        list.add("277");
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return 1;
            }
        });

        for (String s : list) {
            System.out.println(s);
        }

    }

要让这个list排完序后,如果里面的内容存在于fund中,则排在最前面,就是450,460,470,480这几个元素要在最前,这个该怎么写

阅读 13.6k
4 个回答

一种办法,是把范围内和范围外的数据单独排序,完了再合并。

另一种办法,做两次比较。先判断两个数据是否都在范围内,如果一个在一个不在,先后顺序马上就能确定出来;然后再对都在范围内或者都在范围外的情况下,进行普通的比较。

实际操作的时候可以先标准两个对象,用位的思路。用 1 标记 o1 在范围内,用 2 标记 o2 在范围内。两个标记值相加得到总标记 m。那么,他们都在范围内或都在范围外的时候,m == 0 || m == 3。另外,在 m == 1 或者 m == 2 的时候,根据 m 的值就知道哪个该在前了。

public int compare(String o1, String o2) {
    int m = fund.contains(o1) ? 1 : 0;
    m += (fund.contains(o2) ? 2 : 0);
    return m == 0 || m == 3
        ? o1.compareTo(o2)
        : m == 1 ? -1 : 1;
}

2022-03-10 补充

看了 @大马扎 的回答,补充一下代码。因为都是表示数字的定长字符串比较,所以如果要让它们变大,只需要前缀一个字母就可以了

list.sort((o1, o2) -> {
    o1 = fund.contains(o1) ? o1 : "X" + o1;
    o2 = fund.contains(o2) ? o2 : "X" + o2;
    return o1.compareTo(o2);
});

这个方法代码比较简洁,就是会产生辅助用的 String 对象。

用两个List,将存在的元素放在list1)中,将不存在的放在list2中,然后分别排序,最后list1.addAll(list2)

思路:list排完序后,如果里面的内容存在于fund中,将这个值进行放大,按照同样的规则。
放大之后要大于你的list里的最大值。

450,460,470,480这几个要排序吗

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题