2014-04-27 56 views
1

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

例如:

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

而且在该列表:

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

我需要在每个字符串的数字来排序。 (列表中会有更多的项目)。

+0

如果你碰巧在UNIX,Linux或OS X终端上很舒服,你可能想看看命令“sort -k3 -n”是否符合你的建议。 – minopret

回答

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] 
+0

就像一个快速问题一样**?**和**:**意味着/做了什么? – Gokarting54

+1

@ Gokarting54 http://stackoverflow.com/questions/798545/what-is-the-java-operator-called-and-what-does-it-do – axiom

+0

谢谢,我现在可以理解代码! – Gokarting54

4

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

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

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

+0

啊,但第一个空间就在破折号后面,所以我怎么得到第二个空间呢? – Gokarting54

+3

为什么downvote?这是完全正确的,想写同样的...从我+1 +1 – ElDuderino

+2

@ Gokarting54:加1到破折号的索引,然后搜索这个索引后的第一个空格。 –

1

如果你的ArrayList的元素,从这个是相同的格式为PersonOne - 1234 seconds,你可以把整数作为,

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

采取一切整数这种格式和排序。

+0

所以“\\ s”得到所有字母? – Gokarting54

+0

但是我怎么会然后整理这些整数列表? – Gokarting54

+0

@ Gokarting54 \\ s将按空格分割字符串(\ n,\ r,\ t,\ f和“”) 通过使用Collection.sort,您可以轻松地对列表进行排序 –

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

它必须是'Collections.sort()' – Braj

+0

@Braj。 iPhone上的缩略代码有其挑战。自Java 8以来,可以使用 – Bohemian

+0

...或list.sort(比较器)。 – Pshemo

0

我认为你的数组不应该只是一个String的数组。昆虫学可以创建一个类,其中包含Integer类型Stringtime的两个变量name。之后,您可以创建您创建的类的一个对象数组。然后你可以按秒排序。

类会有一些怎么样以下几点:(注:编码不测试

 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