如何按降序对列表中的字符串进行排序,并从中提取最大的字符串数

时间:2014-02-21 18:25:57

标签: java list sorting

以下是我的列表,其中始终采用aXXXX -

的形式
List<String> child = Arrays.asList("a5", "a10", "a2", "a1", "a40");
System.out.println(child);

我的child列表将始终包含aXXXX

形式的字符串

现在我需要对上面的列表进行排序并从中提取最大的字符串..

所以在上面的例子中,它将是a40。我最初想要使用Collections.sort(child);,但它没有按正确的升序排序。

4 个答案:

答案 0 :(得分:0)

可以进行排序,但您必须在开头提取“a”并将其余部分视为整数,以防止字符串"2"大于字符串"10"。尝试Comparator执行此操作,或创建仅包含提取的整数的新列表。

答案 1 :(得分:0)

你快到了。可能的解决方案是编写自己的比较器:

Collections.sort(child,new Comparator<String>() {
    @Override
    public int compare(String lhs, String rhs) {
        \\compare 2 values
        return result;
    }
});

http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

可能返回的值:

-1 : lhs < rhs
0 : lhs == rhs
+1 : lhs > rhs

答案 2 :(得分:0)

您可以使用定义分类策略的比较器: 另请参阅http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Main {

    static final Comparator<String> aStringComparator = new Comparator<String>() {
        public int compare(String s1, String s2) {
            //assumed input are strings in the form axxxx
            int numfromS1 = Integer.valueOf(s1.subSequence(1, s1.length()).toString());
            int numfromS2 = Integer.valueOf(s2.subSequence(1, s2.length()).toString());
            return numfromS1 - numfromS2;
        }
    };

    public static void main(String[] args) {
        List<String> child = Arrays.asList("a5", "a10", "a2", "a1", "a40");
        Collections.sort(child, aStringComparator);
        System.out.println(child);
    }
}

答案 3 :(得分:0)

其他人已经展示了如何使用Java 7做到这一点。

这也可以使用Java 8完成以下操作:

    List<String> child = Arrays.asList("a5", "a10", "a2", "a1", "a40");
    String result = child.stream()
            .sorted(
                    Collections.reverseOrder(
                            Comparator.comparing(
                                    c -> Integer.parseInt(c.substring(1, c.length()))
                            )
                    )
            )
            .findFirst().get();
    System.out.println(result);

这是做什么的:

  1. Stream<String>获取child
  2. 创建一个反向Comparator<String>,它基于lambda c -> Integer.parseInt(c.substring(1, c.length()))进行比较,后者将第二个字符的文本解析为字符串。
  3. 查找第一个结果。
  4. 使用Optional<String>findFirst()返回的get()中取出它。
  5. Comparator可以通过将.reversed()附加到Collections.reverseOrder()而不是将其包裹在{{1}}中来更好地编写,但我不确定它现在是如何工作的。