Почему Collection.sort возвращает нули?

294
21 января 2017, 10:43

Задание состоит в том, чтобы отсортировать объекты. Необходимо создать список из двадцати объектов. КАждый объект - это комната со случайно заданными шириной и длиной.

Класс RoomComporator воплощает интерфейс Comporator. Я хочу отсортировать комнаты в соответствии с их площадями, используя следующую команду: Collection.sort( list, new RoomComparator())

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

Вот код для класса RoomComporator:

import java.util.Comparator;
public  class RoomComporator  implements Comparator<Room> {
public RoomComporator(){}

@Override
public int compare(Room r1, Room r2 ) {
return r1.square- r2.square;}
}

И код для главного класса Room:

import java.util.List;
import java.util.Collections;
import java.util.LinkedList;
public class Room {
int length;
int width;
int square;

public int getWidth(){
    return this.width;
}
public void setWidth(int width){
    this.width = width;
}
public int getLength(){
    return this.length;
}
public int setLength(int length){
    return this.length = length;
}
public Room(int l, int w) {
    this.length = l;
    setWidth(w);
}
void square(){
    int l, w;
    l = length;
    w = width;
    int s = w*l;
    System.out.println(s);
}
Room (int square){
    this.square=square;
}

void printRoom(){
System.out.println(length   + "   " +   width);
}
public static void main(String[] args){
List<Room> rooms = new LinkedList <Room>();
int numRooms = 20;
int maxLength = 9;
int maxWidth = 9;

for( int i = 0; i < numRooms; i++)
{
    int length =  1 + (int)(Math.random()*maxLength);
    int width = 1 + (int)(Math.random()*maxWidth);
    Room r = new Room(length, width);
    System.out.println("Room " + (i + 1));
    r.printRoom();
    r.square();
    rooms.add(r);
}

for( int i = 0; i < numRooms; i++){
    Collections.sort(rooms, new RoomComporator());
    System.out.println(rooms.get(i).square);}
}
}
Answer 1

Вместо реализации компаратора реализуйте интерейфейс Comparable для Room

 public class Room implements Comparable {
    public int compareTo(Room room){
        return this.square - room.square;

http://metanit.com/java/tutorial/5.6.php

Answer 2

Ваш класс Room должен реализовать интерфейс Comparable

List<MyObject> list = new ArrayList<MyObject>();
Comparator<MyObject> comparator = new Comparator<MyObject>() {
    @Override
    public int compare(MyObject left, MyObject right) {
        return left.getId() - right.getId(); 
    }
};
Collections.sort(list, comparator);
System.out.println(list);

Java 8 используя лямбда

List<MyObject> list = new ArrayList<MyObject>();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);

Подробный пример...

import java.util.*;
class Dog implements Comparator<Dog>, Comparable<Dog> {
   private String name;
   private int age;
   Dog() {
   }
   Dog(String n, int a) {
      name = n;
      age = a;
   }
   public String getDogName() {
      return name;
   }
   public int getDogAge() {
      return age;
   }
   // Overriding the compareTo method
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }
   // Overriding the compare method to sort the age 
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }
}
public class Example {
   public static void main(String args[]) {
      // Takes a list o Dog objects
      List<Dog> list = new ArrayList<Dog>();
      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));
      Collections.sort(list);   // Sorts the array list
      for(Dog a: list)   // printing the sorted list of names
         System.out.print(a.getDogName() + ", ");
      // Sorts the array list using comparator
      Collections.sort(list, new Dog());
      System.out.println(" ");
      for(Dog a: list)   // printing the sorted list of ages
         System.out.print(a.getDogName() +"  : "+ a.getDogAge() + ", ");
   }
}
READ ALSO
Sqlite каскадное удаление данных

Sqlite каскадное удаление данных

ЗдравствуйтеНеобходимо при удалении данных из таблицы test что бы удалялись данные и из таблиц test2 и test3

404
Telegram bot java [требует правки]

Telegram bot java [требует правки]

I downloaded lib https://githubcom/rubenlagus/TelegramBots/releases/tag/2

573
Реализация Singleton

Реализация Singleton

Добрый день

340