Recent Changes - Search:

Oktatás

* Programozás 2
  + feladatsor
  + C feladatsor
  + Python feladatsor
  + GitHub oldal

* Szkriptnyelvek
  + feladatsor
  + quick link

* levelezősök
  + Adator. prog.
  + feladatsor
  + quick link

teaching assets


Félévek

* 2024/25/1
* archívum


Linkek

* kalendárium
   - munkaszüneti napok '20
* tételsorok
* jegyzetek
* szakdolgozat / PhD
* ösztöndíjak
* certificates
* C lang.
* C++
* C#
* Clojure
* D lang.
* Java
* Nim
* Scala


[ edit | logout ]
[ sandbox | passwd ]

saját objektumok rendezése a Comparable interfésszel

Objektumok rendezésére két módszer is van: 1) Comparable interfész implementálása, ill. 2) Comparator használata.

Most a Comparable interfészt nézzük meg. Ez akkor használatos, amikor az objektumainkon értelmezett egy természetes rendezés. Ez azt jelenti, hogy az objektumainkat egyféleképpen akarjuk rendezni.

Például vegyük a Kör osztályt. Ha köröket akarunk rendezni, akkor lehetne kerület, terület, sugár, ill. átmérő szerint is rendezni, de a kör mérete csupán a sugártól függ. A kerületet, területet, átmérőt a sugár határozza meg. Vagyis ha köröket akarunk rendezni, akkor magától adódik, hogy a sugár alapján érdemes őket rendezni.

Ha vesszük személyek egy listáját, akkor azt többféleképpen is lehet rendezni: családnév szerint, születési dátum szerint, testmagasság szerint, stb. Ebben az esetben a Comparator használata a szerencsésebb.

Nézzük akkor a körök rendezését:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Circle implements Comparable<Circle> {

    private double r;

    public Circle (double r){
        this.r = r;
    }

    public double getR() {
        return this.r;
    }

    public Circle() {
        this.r = 1.0;
    }

    public double kerulet(){
        return 2 * this.r * Math.PI;
    }

    public double terulet(){
        return r * r * Math.PI;
    }

    @Override
    public String toString() {
        return String.format("Circle(r=%.2f)", this.r);
    }

    @Override
    public int compareTo(Circle other) {
        return (int) Math.signum(this.getR() - other.getR());
    }  

}

public class Proba {

    public static void main(String[] args) {
        Proba m = new Proba();
        m.start();
    }

    private void start() {
        Circle c1 = new Circle();
        Circle c2 = new Circle(2.0);
        Circle c3 = new Circle(3.5);
        Circle c4 = new Circle(7.2);

        List<Circle> li = new ArrayList<>();
        li.add(c3);
        li.add(c1);
        li.add(c4);
        li.add(c2);
        System.out.println("Nincs rendezve:");
        System.out.println(li);
        System.out.println();

        System.out.println("Rendezve:");
        Collections.sort(li);    // ennyi, automatikusan a compareTo függvényt használja
        System.out.println(li);
    }

}

Kimenet:

Nincs rendezve:
[Circle(r=3.50), Circle(r=1.00), Circle(r=7.20), Circle(r=2.00)]

Rendezve:
[Circle(r=1.00), Circle(r=2.00), Circle(r=3.50), Circle(r=7.20)]

Az osztályunknak implementálnia kell a Comparable interfészt. Ehhez felül kell írni a compareTo függvényt, ami a köv. értékeket adja vissza:

  • negatív, ha az adott obj. kisebb, mint a másik
  • nulla, ha egyformák
  • pozitív, ha az adott obj. nagyobb, mint a másik

A példában ha a sugár egy int lenne, akkor elég lenne a "return this.getR() - other.getR();" is.

Cloud City

  

Blogjaim, hobbi projektjeim

* The Ubuntu Incident
* Python Adventures
* @GitHub
* heroku
* extra
* haladó Python
* YouTube listák


Debrecen | la France


[ edit ]

Edit - History - Print *** Report - Recent Changes - Search
Page last modified on 2021 November 19, 11:15