0

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

4

4 回答 4

4

由于您要对名称进行排序,因此创建一个具有两个字段的类Name是合乎逻辑的: firstNamelastName,一个用于初始化这两个字段的构造函数和 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()方法对其进行排序。

我希望这对你有帮助!如果您有任何问题,请随时与我联系。

于 2013-03-13T19:53:46.303 回答
1

两种解决方案:

1- 创建一个具有两个成员的专用对象并实现Comparable接口。现在您可以使用Collections.sort

2-将Collections.sort与自定义比较器一起使用。

像往常一样,番石榴具有非常好的功能。见订购

于 2013-03-13T19:14:35.640 回答
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);
于 2013-03-13T19:32:52.690 回答
0

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);
于 2013-03-13T19:21:05.283 回答