Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка в Java - легко!

Автор: VanGlass
Перевод: Станислав Песоцкий.
Источник:
http://www.javaportal.ru/

Временами сортировка массивов простых типов в Java заставляет нас потрудиться. Не говоря о сортировке массивов объектов. Теперь же мы можем сортировать и массивы простых типов и массивы объектов, написав относительно малый код, с помощью интерфейса Comparable.

java.util.Comparable это класс, содержащий определение правильного порядка двух объектов. Это применимо только для небольшого числа классов, которые по умолчанию реализованы в интерфейсе Comparable. Один из них - это класс String. В реализации интерфейса Comparable класс String перегружает метод compareTo(Object obj). Метод compareTo(Object obj) возвращает отрицательное integer, ноль или положительное integer, когда текущее значение меньше чем, равно, или больше чем полученный объект.

Ваша работа уже выполнена за вас в классе String. Тем не менее, если вы хотите обеспечить способность сортировки ваших собственных классов, тогда вы должны реализовать(implement) Comparable и перегружать compareTo(Object obj) самостоятельно. Ниже следует простой пример, в котором определен класс Student. Каждый Student содержит studentid, first_name, last_name. Согласно нашим спецификациям Student можно сортировать по student_id.

import java.util.*;

public class Student implements Comparable
{
  public int student_id;
  public String last_name;
  public String first_name;
                           
  public Student(int student_id, String last_name, String first_name)
  {
    this.student_id = student_id;
    this.last_name = last_name;
    this.first_name = first_name;  
  }
                           
  /* Перегрузка метода compareTo */
                       
  public int compareTo(Object obj)
  {
    Student tmp = (Student)obj;
    if(this.student_id < tmp.student_id)
    {
      /* текущее меньше полученного */
      return -1;
    }   
    else if(this.student_id > tmp.student_id)
    {
      /* текущее больше полученного */
      return 1;
    }
    /* текущее равно полученному */
    return 0;  
  }

}

Теперь, когда в классе Student перегружен метод compareTo(Object obj), мы легко можем сортировать массив объектов типа Student. Здесь использовался класс java.util.Array и его статический метод sort. Метод main добавлен, чтобы продемонстрировать, как это будет работать.

public static void main(String[] args)
{
  /* Создание массива объектов Student */
                     
  Student[] students = new Student[3];
  students[0] = new Student(52645,"Smith","Bob");
  students[1] = new Student(98765,"Jones","Will");
  students[2] = new Student(1354,"Johnson","Matt");
                           
  /* Сортировка массива */
  Arrays.sort(students);
                           
  /* Печать отсортированных значений */
                           
  for(int i = 0; i < students.length; i++)
  {
    System.out.println(students[i].student_id + 
    students[i].last_name + students[i].first_name);
  }
}

Действительно просто? Чуть-чуть работы и класс Student можно заставить сортировать по комбинации полей. Например, вы захотите сортировать сначала по last_name, а затем по student_id. Не забывайте, что класс Arrays может сортировать любой массив, включая массив элементов простых типов. Для простых типов, однако, нет необходимости в реализации (implement) Comparable. И без этого очень легко сортировать int, float и т.п.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
95K
22 мая 2015 года
Игорь Карачун
0 / / 22.05.2015
+2 / -1
Мне нравитсяМне не нравится
22 мая 2015, 13:27:51
"Чуть-чуть работы и класс Student можно заставить сортировать по комбинации полей. "

как это сделать? помогите новичку.
1.1.
95K
22 мая 2015 года
Игорь Карачун
0 / / 22.05.2015
+0 / -1
Мне нравитсяМне не нравится
22 мая 2015, 13:28:24
новичку-балбесу:))
2.
94K
04 ноября 2014 года
Денис Коновалов
0 / / 04.11.2014
+3 / -0
Мне нравитсяМне не нравится
4 ноября 2014, 20:32:12
/* Перегрузка метода compareTo без IF - ов */

public int compareTo(Object obj)
{
Student tmp = (Student)obj;
return (this.student_id - tmp.student_id);
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог