我是java的新程序员。 我想使用集合对一对字符串进行排序。 基本上我想对名称进行排序,名称有两部分,名字和姓氏。 现在,如果我在列表中取名并对其进行排序,那么在排序名字时我将如何保留第二个名称的更改索引。 请帮助.........
答案 0 :(得分:4)
由于您要对名称进行排序,因此创建类名称是合乎逻辑的,包含两个字段: firstName 和 lastName ,用于初始化两个字段和getter的构造函数,以便我们稍后可以对其进行测试。
public class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
现在,由于您希望能够比较名称,因此必须确保 Name 实现 Comparable 接口。实现此接口需要覆盖 campareTo()方法,在该方法中告诉程序如何比较这两个对象。像这样:
public class Name implements Comparable<Name> {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public int compareTo(Name otherName) {
if(this.firstName.compareTo(otherName.firstName) == 0) {
return this.lastName.compareTo(otherName.lastName);
}
else {
return this.firstName.compareTo(otherName.firstName);
}
}
}
compareTo()方法会发生什么: 首先,我们检查名字是否相等( compareTo 返回零)。如果是这种情况,我们使用姓氏排序。否则,我们使用名字排序。有关字符串的compareTo方法的更多信息:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#compareTo(java.lang.String)
现在您可以使用此测试类进行测试:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
Name name = new Name("A", "C");
Name name1 = new Name("A", "A");
Name name2 = new Name("Ba", "F");
Name name3 = new Name("Bb", "A");
Name name4 = new Name("Ca", "D");
Name name5 = new Name("Cc", "Z");
Name name6 = new Name("Cc", "W");
Name nameArray[] = {name, name1, name2, name3, name4, name5, name6};
List<Name> names = new ArrayList<Name>(Arrays.asList(nameArray));
Collections.sort(names);
for(Name n : names) {
System.out.println(n.getFirstName() + " " + n.getLastName());
}
}
}
我们创建名称列表,并使用 Collections.sort()方法对其进行排序。
我希望这对你有所帮助!如果您有任何疑问,请不要犹豫与我联系。
答案 1 :(得分:1)
两种解决方案:
1-创建一个包含两个成员的专用对象,并实现Comparable接口。现在您可以使用Collections.sort
2-将Collections.sort与自定义比较器一起使用。
像往常一样,Guava有很好的功能。见Ordering
答案 2 :(得分:1)
这是一个类似于你需要的东西的例子,尽管在某些情况下面向对象的解决方案可能更好。列出数组中的字符串并在比较器中逐个比较它们,直到它们不再相等。数组将维持该对,比较器将负责该命令。
List<String[]> strings;
Comparator comparator = new Comparator<String[]>(){
@Override
public int compare(String[] o1, String[] o2) {
//if parameters are invalid, throw them out.
if(o1 == null || o2 == null || o1.length == 0 || o2.length == 0){
throw new InvalidParameterException();
}
//Compare the two arrays of strings, string by string.
int length = Math.min(o1.length, o2.length);
for(int i = 0; i < length; i++){
int compare = o1[i].compareTo(o2[i]);
if(compare != 0){
return compare;
}
}
//If the two strings are of different lengths but the same until that point, return the longer string as greater.
if(o1.length > o2.length){
return 1;
} else if(o2.length > o1.length) {
return -1;
}
return 0;
}
};
Collections.sort(strings, comparator);
答案 3 :(得分:0)
实施Comparable接口
Class Student implements Comparable{
private String FirstName;
private String SecondName;
// getters and setters
public int compareTo(Student s){
return this.getFirstName().compareTo(s.getFirstName());
}
}
List<Student> list = new ArrayList();
Collections.sort(list);