2015-10-15 2 views
-2

Мне нужно использовать PriorityQueue для сортировки объектов Person.Сортировка очереди очередей приоритетов

Класс Person:

public class Person implements Comparable<Person>{ 
    private String firstName; 
    private String lastName; 

    public Person(String firstName, String lastName){ 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() {return firstName;} 

    public String getLastName() {return lastName;} 

    public String toString(){ 
     return "Name: " + firstName + " " + lastName + "\n"; 
    } 

    public int compareTo(Person p){ 
     String pname1 = firstName + lastName; 
     String pname2 = p.firstName + p.lastName; 
     return pname1.compareTo(pname2); 
    } 

Основной код:

import java.util.PriorityQueue; 

    public class priorityQ{ 
     public static void main(String[] args){ 
      PriorityQueue<Person> pers = new PriorityQueue<Person>(); 
      pers.add(new Person("Sam", "Smith")); 
      pers.add(new Person("Charlie", "Black")); 
      pers.add(new Person("Betty", "Brown")); 
      pers.add(new Person("Jessica", "Stewart")); 
      pers.add(new Person("John", "Friday")); 
      pers.add(new Person("Frank", "Folcy")); 
      System.out.print(pers);  
     } 
    } 

мне нужно:

  1. Печать без сортировки (уже сделано в основной)
  2. Сортировать по фамилия
  3. Сортировка по имени, фамилии

Я не должен изменять код в классе Person.

Я создал новый класс:

import java.util.Comparator; 
    public class LastNameComparator implements Comparator<Person>{ 
     public int compareTo(Person a, Person b){ 
     Person p1 = (Person)a; 
     Person p2 = (Person)b; 
     if(p1.getLastName().equals(p2.getLastName())) 
     { 
      return p1.getFirstName().compareTo(p2.getFirstName()); 
     } 
     return p1.getLastName().compareTo(p2.getLastName()); 
     } 
    } 

имеет ошибку компиляции:

LastNameComparator.java:2: error: LastNameComparator is not abstract and does not override abstract method compare(Person,Person) in Comparator 
+0

Вам также нужно использовать 'PriorityQueue'? –

+0

выполните то, что сообщает сообщение об ошибке: 'не переопределяет сравнение (Person, Person)' - вы назвали его compareTo – EGOrecords

+0

@Override Annotation сообщит вам об ошибке, потому что compareTo не отменяет ничего. – EGOrecords

ответ

0

сначала вы должны удалить comparable interface из person class и всех его реализации : попробовать сделать так:

import java.util.Comparator; 
    public class LastNameComparator implements Comparator<Person>{  
    @Override 
    public int compare(Person o1, Person o2) { 

     return o1.lastname.compareTo(o2.lastname); 
    } 
    } 

И в main method сделать следующее так rt по фамилии:

Collections.sort(pers,new LastNameComparator()); 
    Iterator<Person> it = pers.iterator(); 
    while(it.hasNext()){ 
     System.out.println(it.next()); 
     } 
+0

, пожалуйста, дайте мне знать @ Konorika это работа для u – Roushan45

0

Прежде всего: Пожалуйста, удалите

implements Comparable<Person> 

и

public int compareTo(Person p){ 
     String pname1 = firstName + lastName; 
     String pname2 = p.firstName + p.lastName; 
     return pname1.compareTo(pname2); 
    } 

от класса Person, так как вы не вслух вносить какие-либо изменения в него.

Второе: Класс компаратора имеет только сравнение (T ob1, T2 ob2) метод, нет публичного int compareTo (Person a, Person b). Итак, создайте сравнение (T ob1, T2 ob2) и добавьте примечание @Override поверх него, чтобы быть уверенным, что все сделано правильно.

Так ведь у вас Компаратор класса должны быть

@Override 
public int compare(Person a, Person b){ 
//..your code 
} 

Остальной код кажется нормально, от быстрого взгляда ...

Смежные вопросы