Java 如何按字符串中的整数对字符串列表进行排序*爪哇*

Java 如何按字符串中的整数对字符串列表进行排序*爪哇*,java,Java,我有一个问题。在Java程序中,我有一个字符串列表,但我需要知道如何按字符串中包含的整数对它们进行排序 例如: ArrayList<String> list = new ArrayList<String>(); 我需要按每个字符串中的数字进行排序。列表中将有更多项。首先将这些字符串转换为结构化对象,例如包含名称字符串和秒数int。然后按秒数对这些对象进行排序 解析字符串应该非常简单:您只需要找到第一个破折号的索引,以及破折号后第一个空格的索引。应该可以帮助您找到如何查找

我有一个问题。在Java程序中,我有一个字符串列表,但我需要知道如何按字符串中包含的整数对它们进行排序

例如:

ArrayList<String> list = new ArrayList<String>();

我需要按每个字符串中的数字进行排序。列表中将有更多项。

首先将这些字符串转换为结构化对象,例如包含名称字符串和秒数int。然后按秒数对这些对象进行排序

解析字符串应该非常简单:您只需要找到第一个破折号的索引,以及破折号后第一个空格的索引。应该可以帮助您找到如何查找字符串中的字符,以及如何提取子字符串


请注意,除非这些字符串来自您必须解析的文件或外部资源,否则您不应该首先解析它们。从一开始就使用Score对象,只有在必须打印时才将其转换为字符串。

首先将这些字符串转换为结构化对象Score,例如包含名称字符串和秒数int。然后按秒数对这些对象进行排序

解析字符串应该非常简单:您只需要找到第一个破折号的索引,以及破折号后第一个空格的索引。应该可以帮助您找到如何查找字符串中的字符,以及如何提取子字符串


请注意,除非这些字符串来自您必须解析的文件或外部资源,否则您不应该首先解析它们。从一开始就使用Score对象,只有在必须打印它们时才将它们转换为字符串。

如果ArrayList元素的格式与PersonOne相同-从这开始1234秒,您可以将整数作为

String str = "PersonOne - 1234 seconds";
int integer = Integer.ParseInt(str.split("\\s")[2]);

获取此格式的所有整数并对其进行排序。

如果您的ArrayList元素与PersonOne的格式相同,则在此之后1234秒,您可以将整数作为

String str = "PersonOne - 1234 seconds";
int integer = Integer.ParseInt(str.split("\\s")[2]);

获取此格式的所有整数并对其进行排序。

由于列表中有字符串,因此可以编写自定义比较器来执行此操作。 在比较器中,需要提取数字。要做到这一点,可以在空间上拆分-然后在空间上拆分

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("PersonTwo - 5678 seconds");
    list.add("PersonOne - 1234 seconds");
    list.add("PersonOnedf - 34 seconds");

    System.out.println("Initial : " + list); 
    Collections.sort(list, new Comparator<Object>() {
           @Override
           public int compare(Object arg0, Object arg1) {
               String s1 = (String)arg0;
               String s2 = (String)arg1;
               Integer n1 = Integer.parseInt(s1.split("-")[1].trim().split(" ")[0]);
               Integer n2 = Integer.parseInt(s2.split("-")[1].trim().split(" ")[0]);
               return (n1 < n2 ? -1 : 1);
           }
       });

     System.out.println("Sorted : " + list);

}

由于列表中有字符串,因此可以编写自定义比较器来执行此操作。 在比较器中,需要提取数字。要做到这一点,可以在空间上拆分-然后在空间上拆分

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("PersonTwo - 5678 seconds");
    list.add("PersonOne - 1234 seconds");
    list.add("PersonOnedf - 34 seconds");

    System.out.println("Initial : " + list); 
    Collections.sort(list, new Comparator<Object>() {
           @Override
           public int compare(Object arg0, Object arg1) {
               String s1 = (String)arg0;
               String s2 = (String)arg1;
               Integer n1 = Integer.parseInt(s1.split("-")[1].trim().split(" ")[0]);
               Integer n2 = Integer.parseInt(s2.split("-")[1].trim().split(" ")[0]);
               return (n1 < n2 ? -1 : 1);
           }
       });

     System.out.println("Sorted : " + list);

}

使用自定义比较器:

Collections.sort(list, new Comparator<String> () {
    public int compare(String a, String b) {
        return Integer.compare(Integer.parseInt(a.replaceAll("\\D", "")), Integer.parseInt(b.replaceAll("\\D", "")));
    }
});
您甚至可以创建一个帮助器方法以使代码更清晰:

Collection.sort(list, new Comparator<String> () {
    public int compare(String a, String b) {
        return Integer.compare(parse(a), parse(b));
    }
    int parse(String s) {
        return Integer.parseInt(s.replaceAll("\\D", ""));
    }
});

使用自定义比较器:

Collections.sort(list, new Comparator<String> () {
    public int compare(String a, String b) {
        return Integer.compare(Integer.parseInt(a.replaceAll("\\D", "")), Integer.parseInt(b.replaceAll("\\D", "")));
    }
});
您甚至可以创建一个帮助器方法以使代码更清晰:

Collection.sort(list, new Comparator<String> () {
    public int compare(String a, String b) {
        return Integer.compare(parse(a), parse(b));
    }
    int parse(String s) {
        return Integer.parseInt(s.replaceAll("\\D", ""));
    }
});

我认为你的数组不应该只是一个字符串数组。插入后,您可以创建一个类,该类包含两个类型为String的变量名和类型为Integer的时间。之后,可以创建所创建类的对象数组。然后,您可以根据以秒为单位的时间对列表进行排序

该类将类似于以下内容:注意:编码的未经测试

然后,您可以创建该类的数组,如下所示:

ArrayList<SomeClassName> list = new ArrayList<SomeClassName>();
list.add( new SomeClassName("PersonOne" ,1234) );
list.add( new SomeClassName("PersonTwo",5678) );

要根据某个属性对对象数组列表进行排序,需要使用自定义压缩程序。检查此链接:

我认为您的数组不应该只是一个字符串数组。插入后,您可以创建一个类,该类包含两个类型为String的变量名和类型为Integer的时间。之后,可以创建所创建类的对象数组。然后,您可以根据以秒为单位的时间对列表进行排序

该类将类似于以下内容:注意:编码的未经测试

然后,您可以创建该类的数组,如下所示:

ArrayList<SomeClassName> list = new ArrayList<SomeClassName>();
list.add( new SomeClassName("PersonOne" ,1234) );
list.add( new SomeClassName("PersonTwo",5678) );

要根据某个属性对对象数组列表进行排序,需要使用自定义压缩程序。检查此链接:

Ahh,但是第一个空格直接在破折号之后,所以我如何获得第二个空格?为什么要向下投票?完全正确,我想写同样的+1来自me@Gokarting54:将1添加到破折号的索引中,并搜索该索引后的第一个空格。@JBNizet谢谢,我现在就知道怎么做了!啊,但是第一个空格就在破折号后面,那么我怎么才能得到第二个空格呢?为什么要投反对票?完全正确,我想写同样的+1来自me@Gokarting54:将1添加到破折号的索引中,并搜索该索引后的第一个空格。@JBNizet谢谢,我现在就知道怎么做了!如果您对UNIX或Linux或OS X终端感到舒适,您可能希望看到命令sort-k3-n符合您的建议。如果您对UNIX或Linux或OS X终端感到舒适,您可能希望看到sort-k3-n命令按照您的建议执行。因此\\s获取所有字母?但我如何按这些整数对列表进行排序?@Gokarting54\\s将按空格分割字符串\n\r\t\f,通过使用Collection.sort,您可以轻松地对列表进行排序,因此\\s可以获取所有字母?但是,接下来如何按这些整数对列表进行排序?@Gokarting54\\s
将按空格\n、\r、\t、\f分隔字符串,并使用Collection.sort可以轻松地对列表进行排序。它必须是集合。sort@Braj的确如此。iPhone上的拇指代码有它的挑战….或自Java 8以来的list.sortcomparator。它必须是集合。sort@Braj的确如此。iPhone上的拇指代码有它的挑战…或者是自Java 8以来的list.sortcomparator?和:mean/do?@Gokarting54作为一个简单的问题,你的意思是什么?和:你的意思是什么?@Gokarting54