我有一个查询。在我的Java程序中,我有一个字符串列表,但我需要知道如何通过字符串中包含的整数对它们进行排序。
例如:
ArrayList<String> list = new ArrayList<String>();
在该列表中:
"PersonOne - 1234 seconds";
"PersonTwo - 5678 seconds";
我需要按每个字符串中的数字对其进行排序。 (列表中会有更多项目。)
答案 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
类型的String
和time
类型的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