排序包含字符串和整数的数组列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序包含字符串和整数的数组列表相关的知识,希望对你有一定的参考价值。
如果我有以下ArrayList
:
["a 100", "b 32", "t 54", "u 1"]
(数组和字母在数组列表的每个单元格中用空格分隔)。
如何通过数字对数字进行排序,并将每个数字与相应的字母保持一致?
答案
您可以像在常规数组中一样使用交换方法。唯一的区别是我们使用set(index, "value")
方法更新指定索引处的特定字符串。
public static void sort (ArrayList<String> arr){
int N = arr.size();
int E = N-1;
String temp;
boolean flag = true;
while(flag){
flag=false;
for(int a = 0 ; a < E ; a++){
if(Integer.parseInt(arr.get(a).substring(arr.get(a).indexOf(" ")+1)) >
Integer.parseInt(arr.get(a+1).substring(arr.get(a+1).indexOf(" ")+1))) {
temp=arr.get(a);
arr.set(a, arr.get(a+1));
arr.set(a+1, temp);
flag=true;
}
}
E--;
}}
排序算法是冒泡排序。由于简单,我使用过它。如果需要,您可以使用任何其他排序算法。
然后,您可以在main方法中调用sort()
函数:
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
arr.add("a 98");
arr.add("a 23");
arr.add("c 11");
sort(arr);
}
另一答案
这看起来像是在尝试使用字符串实现面向对象的编程。幸运的是,Java已经做到了这一点。
所以,做这样的事情:
public class MyClass implements Comparable<MyClass> {
private final String aString; //could be char perhaps..
private final Integer anInteger;
public MyClass(final String aString, final Integer anInteger) {
this.aString = aString;
this.anInteger = anInteger;
}
public String getAString() { return aString; }
public Integer getAnInteger() { return anInteger; }
public String toString() { return anInteger + " " + aString }
//comparison by number
public int compareTo(final MyClass other) {
return anInteger.compareTo(other.anInteger);
}
}
然后,你像这样使用它:
final List<MyClass> myClasses = new ArrayList<>();
myClasses.add(new MyClass("a", 100));
myClasses.add(new MyClass("b", 32));
myClasses.add(new MyClass("t", 54));
myClasses.add(new MyClass("u", 1));
Collections.sort(myClasses);
另一答案
使用自定义比较器对列表进行排序。
List<String> yourList = Arrays.asList("a 100", "b 32", "t 54", "u 1");
yourList.sort((entry1, entry2) -> {
int number1 = Integer.parseInt(entry1.split(" ")[1]);
int number2 = Integer.parseInt(entry2.split(" ")[1]);
return Integer.compare(number1, number2);
});
问候
另一答案
import static java.lang.Integer.*;
只需导入静态Integer
方法,您将获得最紧凑的Comparator<String>
为您的目的。
(a, b) -> compare(valueOf(a.split(" ")[1]), valueOf(b.split(" ")[1]));
另一答案
假设列表中的元素是相同的模式:
那么你可以做到
public static void main(String[] args) {
// ["a 100", "b 32", "t 54", "u 1"]
List<String> myList = new ArrayList<>();
myList.add("a 100");
myList.add("b 32");
myList.add("t 54");
myList.add("u 1");
System.out.println("List unsorted" + myList);
Collections.sort(myList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
int a1 = Integer.parseInt(o1.substring(2));
int a2 = Integer.parseInt(o2.substring(2));
return Integer.compare(a1,a2);
} catch (NumberFormatException ex) {
return 0;
}
}
});
System.out.println("List sorted" + myList);
}
另一答案
在Java 8中,Comparator
有一些static
和default
方法,可以轻松创建自定义比较器。例如,您可以创建一个拆分每个字符串并将第二个字转换为整数的字符串。
list.sort(Comparator.comparingInt(
s -> Integer.parseInt(s.split(" ")[1])
));
以上是关于排序包含字符串和整数的数组列表的主要内容,如果未能解决你的问题,请参考以下文章
根据字符串数组顺序对 ArrayList 重新排序 - Java