compareTo

0

Witam. Czytałem informacje dot. metody compareTo w javie i zrozumiałem że w domyśle ma ona zwracać wartości -1/0/1. Czy może mi ktoś pomóc napisać metodę która będzie porównywała ceny w mojej klasie i zwracała własnie wartości -1/0/1? Oto mój kod


    public abstract class Vehicle implements UseFuel,HasWheels, Comparable<Vehicle>
    {
        String brand;
        int weigth;
        int price;

        public Vehicle(String brand, int weight, int price)
        {
            this.brand = brand;
            this.weigth = weight;
            this.price = price;
        }
        
        
        
		public String getBrand() {
			return brand;
		}
		public void setBrand(String brand) {
			this.brand = brand;
		}
		public int getWeigth() {
			return weigth;
		}
		public void setWeigth(int weigth) {
			this.weigth = weigth;
		}
		public int getPrice() {
			return price;
		}
		public void setPrice(int price) {
			this.price = price;
		}

		public String toString() {
			return "Vehicle brand=" + brand + ", weigth=" + weigth + ", price=" + price + "";
		}    
		 
		/*public int compareTo(Vehicle other ) {
	        	return this.price.compareTo(other.getPrice());
	        }*/
		
	        public int compareTo(Vehicle other ) {
	        	if (this.price > other.price) return 1;
	        	else if (this.price == other.price) return 0;
	        	else
	            return -1;
	        }
	        
	       

			 public boolean isBrandEqual(Vehicle x, Vehicle y)//porownywanie marki
		        {
		            if (x.brand == y.brand) return true;
		            else
		            return false;
		        }
	        
	        
	       
    }
    
    

Niby próbowałem to już sam napisać, druga metoda compareTo(ta która nie jest wykomentowana) działa dobrze, bo zwraca 1,-1 oraz 0, ale to tylko dlatego że napisałęm tam return -1, a domyślam się że ona powinna domyślnie sama zwracać takie wartośći?

	/*public int compareTo(Vehicle other ) {
	        	return this.price.compareTo(other.getPrice());
	        }*/
		
	        public int compareTo(Vehicle other ) {
	        	if (this.price > other.price) return 1;
	        	else if (this.price == other.price) return 0;
	        	else
	            return -1;
	        }
0

Pewnie chodzi o fakt że "standardem" jest zwracanie -1 gdy jest mniejsza, 0 gry równa, 1 gdy większa, ale sam musisz ten kod napisać, i wcale nie musi to być zawsze -1,0.1

0

Dobra rozumiem. A może mi ktoś powiedzieć jak mam użyć funkcji którą napisałem wyżej w mainie?

Mowa o tym kodzie:

public int compareTo(Vehicle other ) {
                if (this.price > other.price) return 1;
                else if (this.price == other.price) return 0;
                else
                return -1;
            }

Obiekty utworzyłem w ArrayList, o tak:

import java.util.*;
public class Program{

	public static void main(String[] args) {
		
		
		List<Vehicle> list=new ArrayList<Vehicle>();
		list.add(new Car("Infinity", 1700, 170000, "Petrol", 7.3, 245));
		list.add(new Car("Infinity", 1850, 202000, "Petrol", 9.1, 271));
		list.add(new Bicycle("Cube", 10, 8000, "Mountain"));
		list.add(new Bicycle("Romet", 15, 3500, "Road"));
		
	}

Może mi ktoś teraz powiedzieć jak na tych obiektach użyć metody compareTo? Bo gdy tworzę dwa dowolne elementy, to mam ich nazwe i bez problemu wstukuję który obiekt z którym bym chciał porównać, tutaj tego nie mam. A jak chciałbym porównać cene obiektu 1 i 2, które znajdują się w moim ArrayList? czyli kolejno byłyby to te samochody:
list.add(new Car("Infinity", 1700, 170000, "Petrol", 7.3, 245));
list.add(new Car("Infinity", 1850, 202000, "Petrol", 9.1, 271));

1

funkcji compareTo raczej nie używa się "bezpośrednio", "pośrednio" jest używana na przykład przy sortowaniu listy Collections.sort

System.out.println(list.get(0).compareTo(list.get(1)));
System.out.println(list);
Collections.sort(list);
System.out.println(list);

-1
[Vehicle brand=Infinity, weigth=1700, price=170000, Vehicle brand=Infinity, weigth=1850, price=202000, Vehicle brand=Cube, weigth=10, price=8000, Vehicle brand=Romet, weigth=15, price=3500]
[Vehicle brand=Romet, weigth=15, price=3500, Vehicle brand=Cube, weigth=10, price=8000, Vehicle brand=Infinity, weigth=1700, price=170000, Vehicle brand=Infinity, weigth=1850, price=202000]
1

Sama metoda jest mniej więcej ok. Można ją skrócić i napisać bez ifów odejmując ceny. Sama metoda ma zwracać 0, ujemne lub dodatnie, a nie jest wymagane żeby to było 1 i -1. Możed odjąć i jak wyjdzie -100 to też będzie ok i będzie traktowane jak -1.

Powyżej napisałem bzdurę, jak uświadomił mnie @vpiotr.

Posiadasz jednak błąd projektowy. Jeżeli Vehicle jest Comparable, to znaczy że to właśnie jego musisz porównać, a nie cenę. Ten interfejs implementuje się jeżeli masz jedyny słuszny sposób na porównanie. I tak liczbę możesz porównać tak jak matematyka przykazała, dlatego klasa Price byłaby świetna. Vehicle można porównać na tysiące sposób. Raz po cenie, bo chcesz najtańszy, innym razem po mocy, bo chcesz najmocniejszy, a jeszcze innym razem najszybszy. Jeżeli masz klasę która nie może jednoznacznie sprecyzować co znaczy lepszy a co gorszy, to nie implementujesz Comparable, a używasz różnych implementacji Comparator.

reptile333 napisał(a):

funkcji compareTo raczej nie używa się "bezpośrednio", "pośrednio" jest używana na przykład przy sortowaniu listy Collections.sort>

Nieprawda. Szczególnie częstym użyciem compareTo, jest implementacja z BigDecimal, szczególnie że equals zwraca false dla takich samych liczb, ale z inną skalą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1