首先排序自定义字符串

时间:2016-04-19 15:05:43

标签: java sorting

我有一个未分类的List ...让我们说ArrayList包含可以发生多次次的字符串。我怎样才能首先对某个特定字符串的出现进行排序。其余条目可以保留给定顺序。

例如。必须在顶部的某些字符串:' JKL'

未分类:{ DEF, ABC, JKL, GHI, ABC, DEF, JKL, MNO, GHI, ABC, MNO, JKL }

已排序:{ JKL, JKL, JKL, DEF, ABC, GHI, ABC, DEF, MNO, GHI, ABC, MNO }

有什么建议吗? :)

2 个答案:

答案 0 :(得分:1)

您可以从列表中删除每个JKL元素(第一个元素为JKL除外,因为这是不必要的),并在列表的开头添加一个新元素。假设您的列表名为list

for(int i = 1; i < list.length(); i++) { //no need to check if the first element is "JKL"
    if(list.get(i).equals("JKL")) {
        list.remove(i);
        list.add(0, "JKL");
    }
}

确保在将其添加到列表之前将其删除。如果您以其他方式执行此操作,则需要执行list.remove(i+1);

编辑:对于涉及除了最好不删除和重新创建的字符串之外的其他对象的更通用的解决方案,您可以在删除它之前将该元素存储在临时变量中,并将其重新放入列表的开头:

for(int i = 1; i < list.length(); i++) {
    if(list.get(i).equals("JKL")) {
        String temp = list.get(i);
        list.remove(i);
        list.add(0, temp);
    }
}

答案 1 :(得分:1)

使用Comparator,但要小心确保比较器一致。

public void test() {
    List<String> strs = Arrays.asList(new String[]{"DEF", "ABC", "JKL", "GHI", "ABC", "DEF", "JKL", "MNO", "GHI", "ABC", "MNO", "JKL"});
    // All these are special and should appear at the front of the list.
    Set<String> specials = new HashSet<>(Arrays.asList("ABC", "JKL"));
    strs.sort((String o1, String o2) -> {
        if (specials.contains(o1) == specials.contains(o2)) {
            // Both special or both normal - just compare.
            return o1.compareTo(o2);
        } else if (specials.contains(o1)) {
            // First is special!
            return -1;
        } else {
            // Second is special.
            return 1;
        }
    });
    System.out.println(strs);
}