简体   繁体   中英

sorting array of objects by overriding Arrays.sort()

It seems I have misunderstood something about "comparable" - I thought I could override the Arrays.sort() by making a compareTo(Person person) method - what exactly am I missing?

I thought the Arrays.sort would take my Person[] and sort it using my compareTo(Person person) method?

If I am completely off track - could someone nudge me in the right direction..?

import java.util.*;

public class Person implements Comparable<Person>{
protected String surname;
protected String givenName;

//Constructor for my "Person" objects
protected Person(String aSurname, String aGivenName){
    surname=aSurname;
    givenName=aGivenName;
}
public static void main(String[] args){
    //A string of Person objects
    Person[] arrayOfPersons=new Person[6];
    arrayOfPersons[0]=new Person("Kangasniemi","Jerri");
    arrayOfPersons[1]=new Person("Kangasniemi","Jukka");
    arrayOfPersons[2]=new Person("Kangasniemi","Jessicka");
    arrayOfPersons[3]=new Person("Kangasniemi","Johan");
    arrayOfPersons[4]=new Person("Kangasniemi","Joakim");
    arrayOfPersons[5]=new Person("Virtamo","Nina");
    Arrays.sort(arrayOfPersons);
    for (int i = 0; i < arrayOfPersons.length; i++) {
        System.out.println(arrayOfPersons[i].toString());
    }
}
@Override
public String toString(){
    return givenName+" "+surname;
}
@Override
public int compareTo(Person person) {
    String personOne="";
    String personTwo="";
    personOne=this.toString();
    String[] personOneString=personOne.split(" ");
    personTwo=person.toString();
    String[] personTwoString=personTwo.split(" ");
    if (personOneString[1]==personTwoString[1]) {
        if (personOneString[0]==personTwoString[0]) {
            return 0;
        } else if(personOneString[0].compareToIgnoreCase(personTwoString[0])<0){
            return -1;
        } else{
            return 1;
        }
    }else if(personOneString[1].compareToIgnoreCase(personTwoString[1])<0){
        return -1;
    }else{
        return 1;
    }
}
}
@Override
public int compareTo(Person person) {
  int rv = this.givenName.compareToIgnoreCase(person.givenName);
  if (rv != 0) return rv;
  else return this.surname.compareToIgnoreCase(person.surname);
}

Try something like this:

public class Person implements Comparable<Person>{
protected String surname;
protected String givenName;

//Constructor for my "Person" objects
protected Person(String aSurname, String aGivenName){
    surname=aSurname;
    givenName=aGivenName;
}

public String getSurname() {
    return surname;
}

public String getGivenName() {
    return givenName;
}

public static void main(String[] args) {
    Person[] arrayOfPersons=new Person[6];
    arrayOfPersons[0]=new Person("Kangasniemi","Jerri");
    arrayOfPersons[1]=new Person("Kangasniemi","Jukka");
    arrayOfPersons[2]=new Person("Kangasniemi","Jessicka");
    arrayOfPersons[3]=new Person("Kangasniemi","Johan");
    arrayOfPersons[4]=new Person("Kangasniemi","Joakim");
    arrayOfPersons[5]=new Person("Virtamo","Nina");
    Arrays.sort(arrayOfPersons);
    for (int i = 0; i < arrayOfPersons.length; i++) {
        System.out.println(arrayOfPersons[i].toString());
    }
}

@Override
public String toString(){
    return givenName+" "+surname;
}
@Override
public int compareTo(Person person) {
    int surnameComparison = this.surname.compareToIgnoreCase(person.getSurname());
    if(surnameComparison == 0){
        return this.givenName.compareToIgnoreCase(person.getGivenName());
    }
    return surnameComparison;
}

But remember that in the compareTo methods this.surname , this.givenName , person , person.getSurename() and person.getGivenName() cannot be (or returns) null!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM