使用集合对一对字符串进行排序

时间:2013-03-13 19:06:00

标签: collections java

我是java的新程序员。 我想使用集合对一对字符串进行排序。 基本上我想对名称进行排序,名称有两部分,名字和姓氏。 现在,如果我在列表中取名并对其进行排序,那么在排序名字时我将如何保留第二个名称的更改索引。 请帮助.........

4 个答案:

答案 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);