2016-05-24 3 views
0

Как только один архитектор в моем офисе сказал мне, что разница между компаратором и сопоставимым; Компаратор сравнивает между двумя разными объектами класса, где сопоставимые сравнения в одном классе. У меня есть один классный стажер и еще один студент. Я хочу сортировать имена внутри класса Student и Trainee одновременно. У ученика мало имен, а у Старины - несколько имен. Хотите отсортировать все эти имена в натуральном порядке. Можно ли это достичь? Ниже мой код с ошибкой.Пользовательский сортировка с использованием компаратора в java

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

class Student { 
String empName; 

Student(String empName) { 
    this.empName = empName; 
} 
} 

class Trainee { 
String studName; 

Trainee(String studName) { 
    this.studName = studName; 
} 
} 

public class Sort implements Comparator { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    Student st = new Student("caroline"); 
    Student st1 = new Student("elley"); 
    Student st2 = new Student("fannah"); 
    Trainee tr = new Trainee("aundh"); 
    Trainee tr1 = new Trainee("Rohit"); 
    Trainee tr2 = new Trainee("Shammi"); 
    List list = new ArrayList<>(); 
    list.add(st); 
    list.add(st1); 
    list.add(st2); 
    ArrayList list2 = new ArrayList<>(); 
    list2.add(tr); 
    list2.add(tr1); 
    list2.add(tr2); 
    Collections.sort(Student, new Comparator<Trainee>() { 
     @Override 
     public int compare(Student s, Trainee t) { 
      // TODO return 1 if rhs should be before lhs 
      return s.empName.compareToIgnoreCase(t.studName); 
     } 

    }); 

    } 

    } 

ответ

0

Сомневаюсь, что вам нужен компаратор для этого. Строки будут сортироваться в натуральном порядке по умолчанию.

list = Collections.sort(list); 
list2 = Collections.sort(list2); 

должно предоставить вам то, что вы хотите.

Компаратор, который вы написали, не имеет смысла и не будет компилироваться. Оба параметра должны быть одного класса. Он используется для упорядочения одного списка, не относящегося к друг другу.

этого

Collections.sort(Student, new Comparator<Trainee>() { 

должен быть

Collections.sort(list2 , new Comparator<Trainee>() { 

То есть вы говорите, своего рода мой список слушателей с использованием метода сравнения, который я даю вам.

Вы не сортировать класс Стажер Вы сортируете коллекцию экземпляров Стажера.

1

Существует грязный способ сделать то, что приводит к очень нечитаемый код и показывает плохой дизайн

public class NameComparator implements Comparator{ 

    @Override 
    public int compare(Object o1, Object o2) { 
     Student s1 = o1 instanceof Student ? (Student)o1 : null; 
     Student s2 = o2 instanceof Student ? (Student)o2 : null; 
     Trainee t1 = o1 instanceof Trainee ? (Trainee)o1 : null; 
     Trainee t2 = o2 instanceof Trainee ? (Trainee)o2 : null; 
     String st1 = s1 != null ? s1.empName; t1 != null ? t1.studName; null; 
     String st2 = s2 != null ? s2.empName; t2 != null ? t2.studName; null; 
     return st1 != null ? st1.compareTo(st2): 0; 
    } 

} 

Гораздо лучшим вариантом будет использовать общий интерфейс или объект в иерархии и получить свой Студента и Стажер от этого общего объекта.