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

时间:2014-04-27 09:55:30

标签: java

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

例如:

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

在该列表中:

"PersonOne - 1234 seconds";
"PersonTwo - 5678 seconds";

我需要按每个字符串中的数字对其进行排序。 (列表中会有更多项目。)

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

使用自定义比较器:

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", ""));
    }
});

答案 2 :(得分:1)

如果你的ArrayList元素与PersonOne - 1234 seconds格式相同,你可以将整数视为,

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

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

答案 3 :(得分:1)

由于列表中包含字符串,因此可以编写自定义比较器来执行此操作。 在比较器中,您需要提取数字。为此,您可以拆分-,然后拆分空格。

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);

}

<小时/> 输出:

  Initial : [PersonTwo - 5678 seconds, PersonOne - 1234 seconds, PersonOnedf - 34 seconds]
  Sorted : [PersonOnedf - 34 seconds, PersonOne - 1234 seconds, PersonTwo - 5678 seconds]

答案 4 :(得分:0)

我认为你的数组不应该只是String的数组。您可以创建一个类,其中包含name类型的Stringtime类型的Integer。之后,您可以创建您创建的类的对象数组。然后,您可以根据第二个时间列出您的列表。

该课程将如下所示:( 注意:编码未经过测试

     public class SomeClassName
  {
    private String name;
    private Integer time;

    // Constructors

    public SomeClassName()
    {
    super();
    }

    public SomeClassName(String name, Integer time)
    {
    this.name=name;
    this.time=time;
    }
    // create setter and getter methods

    public void setName(String name)
    {
    this.name=name
    }

    public void setTime(Integer time)
    {
    this.time=time
    }

    public String getName()
    {
    return name;
    }
    public Integer getTime()
    {
    return time;
    }


}

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

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

根据您需要使用自定义压缩程序的某个属性对对象的ArrayList进行排序。点击此链接:Sort ArrayList of custom Objects by property