排序链表的困难

时间:2015-10-20 15:08:17

标签: java list sorting comparable

有人可以向我解释如何使用Collections.sort()按姓氏对列表进行排序并显示排序列表。然后编写第二个实现Comparator的内部类,并覆盖compare()方法,允许对size实例变量进行比较。

 public Animal(){
        fname = "unknown";
        lname = "unknown";
        size = 0;
    }

    public Animal(String fname, String lname, int size) {
       this.fname = fname;
       this.lname = lname;
       this.size = size;
    }

   //getters and setters
    public String getFName(){
        return fname;
    }
    public void setFName(String fname){
        this.fname = fname;
    }

    public String getLName(){
        return lname;
    }
    public void setLName(String lname){
        this.lname = lname;
    }

    public int getSize(){
        return size;
    }
    public void setSize(int size){
        this.size = size;
    }

    //compare by fname
    public int compareTo(Animal lname) {
        return fname.compareTo(lname.fname);
    }

    //sound method
    abstract String sound();



    //toString method
    @Override
    public String toString(){
        return getFName() + " " + getLName() + " " + sound() + " " + getSize();
    }



}//end class

public class AnimalTester {

    //inner class implementing comparable
    static abstract class InnerClass implements Comparable<Animal>{  

            private static final String lname = "Not Given";

            List<Animal> dogList2 = new LinkedList<Animal>();
            List<Animal> catList2 = new LinkedList<Animal>();

            //override compareto and compare lname
            int dogListCompare = InnerClass.lname.compareTo(((Animal)    dogList2).getLName());
            int catListCompare = InnerClass.lname.compareTo(((Animal) catList2).getLName());

            }//end inner class

    public static void main(String[] args){
        String fileName = "animal.dat";
        Scanner input = new Scanner(System.in);     


        //create LinkedList
        List<Dog> dogList = new LinkedList<Dog>();
        List<Cat> catList = new LinkedList<Cat>();
        List<Dog> dogList2 = new LinkedList<Dog>();
        List<Cat> catList2 = new LinkedList<Cat>();

        String fname;
        String lname;

        //String yes = "y";
        char yes = 'y';
        int x = 0;

        //while(yes.equals("y")){
        while(yes == 'y' || yes == 'Y'){

            //declare & create a Dog & Cat object
            dogList.add(new Dog());
            System.out.print("First Name (dog): ");
            fname = input.next();
            System.out.print("Last Name (dog): ");
            lname = input.next();
            dogList2.add(new Dog());
            System.out.print("First Name Again (dog): ");
            fname = input.next();
            System.out.print("Last Name Again (dog): ");
            lname = input.next();

            System.out.println(" "); //line break  

            catList.add(new Cat());
            System.out.print("First Name (cat): ");
            fname = input.next();
            System.out.print("Last Name (cat): ");
            lname = input.next();
            catList2.add(new Cat());
            System.out.print("First Name Again (cat): ");
            fname = input.next();
            System.out.print("Last Name Again (cat): ");
            lname = input.next();

            dogList.get(x).setFName(fname);
            dogList.get(x).setLName(lname);
            catList.get(x).setFName(fname);
            catList.get(x).setLName(lname);
            dogList2.get(x).setFName(fname);
            dogList2.get(x).setLName(lname);
            catList2.get(x).setFName(fname);
            catList2.get(x).setLName(lname);

            x++; //increment x

            System.out.print("Continue? [y/n]: ");
            System.out.println(" ");
            yes = input.next().charAt(0);

        }//end while

        System.out.println("");
        //enhanced for loops
        for(Dog element:dogList){
            System.out.println(element.toString());   
        } 
        for(Dog element:dogList2){
            System.out.println(element.toString());   
        } 
        for(Cat element:catList2){
            System.out.println(element.toString());   
        }
        for(Cat element:catList){
            System.out.println(element.toString());   
        }

        //sort lists by fname
        Collections.sort(dogList, new Comparator<Animal>() {
            public int compare(Animal one, Animal fname) {
                return one.getFName().compareTo(fname.getLName());
            }
        }); 
        Collections.sort(catList, new Comparator<Animal>() {
            public int compare(Animal one, Animal fname) {
                return one.getFName().compareTo(fname.getLName());
            }
        }); 

        //sort lists by lname
        Collections.sort(dogList2, new Comparator<Animal>() {
            public int compare(Animal two, Animal lname) {
                return two.getLName().compareTo(lname.getFName());
            }
        }); 
        Collections.sort(catList2, new Comparator<Animal>() {
            public int compare(Animal two, Animal lname) {
                return two.getLName().compareTo(lname.getFName());
           }
       }); 

        //display lists
        System.out.println(" ");
        System.out.println("Initial List ON FName: "+dogList);
        Collections.sort(dogList);
        System.out.println("Sorted List ON FName: "+dogList);
        System.out.println(" ");
        System.out.println("Initial List ON FName: "+catList);
        Collections.sort(catList);
        System.out.println("Sorted List ON FName: "+catList);

        System.out.println(" ");
        System.out.println("Initial List ON LName: "+dogList2);
        Collections.sort(dogList2);
        System.out.println("Sorted List ON LName: "+dogList2);
        System.out.println(" ");
        System.out.println("Initial List ON LName: "+catList2);
        Collections.sort(catList2);
        System.out.println("Sorted List ON LName: "+catList2);



    }//end main 
}//end class

我需要有3组按名字,名字和大小排序的列表。我用第一个和第二个名字尝试了一切,我不能这样做......

2 个答案:

答案 0 :(得分:0)

快速建议,而不是InnerClass实施Comparable<Animal>,您希望它实施Comparator<Animal>Comparable<T>表示此对象可与T进行比较,Comparator<T>表示此对象可以比较两个T

查看Oracle's tutorial on Object Ordering,它实际上非常有用。

答案 1 :(得分:0)

最好使用comparator来排序具有不同条件的相同bean。

以下是一个示例代码:

Dog.class:

public class Dog extends Animal {

    public Dog(String fname, String lname, int size) {
        super(fname, lname, size);
    }

    @Override
    String sound() {
        return "bark";
    }

}

猫类:

public class Cat extends Animal {

    public Cat(String fname, String lname, int size) {
        super(fname, lname, size);
    }

    @Override
    String sound() {
        return "meauvvv";
    }

}

Animal.class:

public abstract class Animal {

    private String fname;

    private String lname;

    private int size;

    public Animal(String fname, String lname, int size) {
       this.fname = fname;
       this.lname = lname;
       this.size = size;
    }

   //getters and setters
    public String getFName(){
        return fname;
    }
    public void setFName(String fname){
        this.fname = fname;
    }

    public String getLName(){
        return lname;
    }
    public void setLName(String lname){
        this.lname = lname;
    }

    public int getSize(){
        return size;
    }
    public void setSize(int size){
        this.size = size;
    }

    //compare by fname
    public int compareTo(Animal lname) {
        return fname.compareTo(lname.fname);
    }

    //sound method
    abstract String sound();



    //toString method
    @Override
    public String toString(){
        return getFName() + " " + getLName() + " " + sound() + " " + getSize();
    }



}

DogCatComparator.class:

public class DogCatComparator implements Comparator<Animal> {

    @Override
    public int compare(Animal arg0, Animal arg1) {


        //null checks here

        if(arg0.sound().equals(arg1.sound())){
            return 0;
        }

        if(arg0.sound().equals("bark") && arg1.sound().equals("meauvvv")){
            return -1;
        }

        return 1;
    }

}

NameComparator.class:

public class NameComparator implements Comparator<Animal> {

    @Override
    public int compare(Animal arg0, Animal arg1) {

        //null check here
        return arg0.getFName().compareTo(arg1.getFName());
    }

}

SizeComparator.class:

public class SizeComparator implements Comparator<Animal> {

    @Override
    public int compare(Animal arg0, Animal arg1) {

        //null check here

        if(arg0.getSize() == arg1.getSize()){
            return 0;
        }

        return arg0.getSize() > arg1.getSize() ? 1 : -1;
    }

}

示例:

public class Main {



    public static void main(String[] args) {

        Dog dog1 = new Dog("dog1Name", "dog1lname", 5);
        Dog dog2 = new Dog("dog2Name", "dog2lname", 3);
        Cat cat1 = new Cat("cat1Name", "cat1lname", 7);
        Cat cat2 = new Cat("cat2Name", "cat2lname", 1);

        List<Animal> animals = new LinkedList<>();
        animals.add(cat2);
        animals.add(cat1);
        animals.add(dog2);
        animals.add(dog1);

        Collections.sort(animals, new DogCatComparator());
        printList(animals);

        Collections.sort(animals, new SizeComparator());
        printList(animals);

        Collections.sort(animals, new NameComparator());
        printList(animals);
    }


    private static void printList(List<Animal> animals){
        System.out.println("-------------");
        for(Animal animal: animals){
            System.out.println(animal.toString());
        }
    }

}

结果:

-------------
dog2Name dog2lname bark 3
dog1Name dog1lname bark 5
cat2Name cat2lname meauvvv 1
cat1Name cat1lname meauvvv 7
-------------
cat2Name cat2lname meauvvv 1
dog2Name dog2lname bark 3
dog1Name dog1lname bark 5
cat1Name cat1lname meauvvv 7
-------------
cat1Name cat1lname meauvvv 7
cat2Name cat2lname meauvvv 1
dog1Name dog1lname bark 5
dog2Name dog2lname bark 3