【问题标题】:Sort an arraylist of strings with following conditions?使用以下条件对字符串数组列表进行排序?
【发布时间】:2018-11-30 05:56:57
【问题描述】:

我有一个字符串数组列表,格式为:

{T1,C1,C2,T2,C3,T3,A1,T4,G1,A2,G2,A3,T5,C4,C5,T6,A4,T7,T8,C6,T9,A5,T10, G3,A6,A7,A8,C7,C8,T11,T12,C9,A9,$1,G4,A10,C10,C11,A11,A12,A13,A14,T13,T14,C12,T15,C13,C14, G5、G6、C15}

我想将此数组列表排序为:

{$1, A1, A2...A10, A11,... C1, C2...C14....}。

但是,当我使用Collections.sort() 时,结果却是:

{$1,A1,A10,A11,A12,A13,A14,A2,A3,A4,A5,A6,A7,A8,A9,C1,C10,C11,C12,C13,C14,C15,C2, C3,C4,C5,C6,C7,C8,C9,G1,G2,G3,G4,G5,G6,T1,T10,T11,T12,T13,T14,T15,T2,T3,T4,T5,T6, T7、T8、T9}

A2 在 A14 之后。那么有没有办法解决这个问题呢?非常感谢!

【问题讨论】:

标签: java


【解决方案1】:

您可以使用Comparator.comparing() 方法链来定义排序标准。将第一个比较定义为Character 对第一个字符进行排序,然后将第二个比较定义为Integer 对剩余的子字符串进行排序:

String[] arr = {"T1", "C1", "C2", "T2", "C3", "T3", "A1", "T4", "G1", "A2", "G2", "A3", "T5",
    "C4", "C5", "T6", "A4", "T7", "T8", "C6", "T9", "A5", "T10", "G3", "A6", "A7", "A8", "C7",
    "C8", "T11", "T12", "C9", "A9", "$1", "G4", "A10", "C10", "C11", "A11", "A12", "A13",
    "A14", "T13", "T14", "C12", "T15", "C13", "C14", "G5", "G6", "C15"};
Arrays.sort(arr, Comparator.<String, Character>comparing(s -> s.charAt(0))
    .thenComparingInt(s -> Integer.parseInt(s.substring(1))));
System.out.println(Arrays.toString(arr));

将打印

[$1, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, G1, G2, G3, G4, G5, G6, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]

【讨论】:

  • 非常感谢!真的很有帮助!
【解决方案2】:

您必须创建一个自己的Comparator 对象,以便以不同于默认顺序的顺序进行排序。当您不提供自己的比较器时,字符串按字典顺序排序。您可以使用List 的新方法代替Collection.sort

myList.sort(new MyComparator());

MyComparator 类是Comparator 的一个实例:

class MyComparator implements Comparator<String> {
   ...
}

你必须实现方法compareTo

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 2021-11-09
    • 2013-12-31
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多