我是java中的新程序员。我想使用集合对一对字符串进行排序。基本上我想对名字进行排序,名字有两部分,名字和姓氏。现在,如果我在列表中取名字并对其进行排序,那么我将如何在对名字进行排序时保留第二个名字的更改索引。请帮忙.........
4 回答
由于您要对名称进行排序,因此创建一个具有两个字段的类Name是合乎逻辑的: 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- 创建一个具有两个成员的专用对象并实现Comparable接口。现在您可以使用Collections.sort
2-将Collections.sort与自定义比较器一起使用。
像往常一样,番石榴具有非常好的功能。见订购
这是您需要的示例,尽管在某些情况下面向对象的解决方案可能会更好。列出数组中的字符串并在比较器中逐一比较它们,直到它们不再相等。数组将维护该对,比较器将处理顺序。
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);
Implement the Comparable interface
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);