Java.Help

  • Автор теми AkeL.php
  • Дата створення

Пух

كنت بلهاء
Модератор
Добрый вечер. Как правильно написать Comparator к классу? Проблема в том, что класс, к которому пишется Comparator, и вызов сортировки будет в разных пакетах. Поэтому не получится написать внутренний класс, как я обычно делал.
 

akl

geek
Можно переопределить метод compareTo у класса, сделав его, соответственно, реализующим интерфейс Comparable.

Вот смотри рабочий пример:
Код:
package com.example.first;

import java.util.*;

public class Person implements Comparable
{
	private String name;
	private int length;

	public Person(String name, int length)
	{
		this.name = name;
		this.length = length;
	}

	public String getName()
	{
		return this.name;
	}

	public int getLength()
	{
		return this.length;
	}

	public int compareTo(Object o) throws ClassCastException
	{
		if (o instanceof Person)
		{
			int length = ((Person)o).getLength();

			if (length < this.length) return 1;
			else if (length > this.length) return -1;
			else return 0;
		} else {
			throw new ClassCastException("wrong object");
		}
	}

	public static void main(String[] args) 
	{
		Person p1 = new Person("Test1", 20);	
		Person p2 = new Person("Test2", 19);

		List<Person> p = new ArrayList<Person>();
		p.add(p1);
		p.add(p2);

		printList(p);

		Collections.sort(p);

		printList(p);
	}

	private static void printList(List<Person> list)
	{
		for (Iterator<Person> itr = list.iterator(); itr.hasNext();)
		{
			Person p = itr.next();

			System.out.println("Name: " + p.getName());
			System.out.println("Age: " + p.getLength());
		}
	}
}
 

Пух

كنت بلهاء
Модератор
akl, compareTo не подходит, т.к. условий сортировки может быть несколько (по каждому из полей класса, к примеру).
Сделал каждый компаратор отдельным публичным классом.
 

dreamer

Member
akl, compareTo не подходит, т.к. условий сортировки может быть несколько (по каждому из полей класса, к примеру).
Сделал каждый компаратор отдельным публичным классом.
Чем не подходит внутренний класс? Все равно использоваться он будет через публичный интерфейс.
Код:
class Person
{
    private Integer age;
    private String name;

    public static final Comparator<Person> AGE_COMPARATOR =
        new Comparator<Person>() {
            public int compare(Person a, Person b) {
                return a.age.compareTo(b.age); }};
}
 

dreamer

Member
Добрый вечер. Как правильно написать Comparator к классу? Проблема в том, что класс, к которому пишется Comparator, и вызов сортировки будет в разных пакетах. Поэтому не получится написать внутренний класс, как я обычно делал.
Между прочим внутренние классы могут быть и публичными.
Код:
class Person
{
    public static class AgeComparator implements Comparator<Person> { }
}
 
Зверху