lista nie chce się posortować

0

Witam przy użyciu Comparator chcę posortować listę ale nie mogę uruchomić sortowania.

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;

public class Exercise1 {

    public static void main(String[] args) {
        List<Adres> listAdres = new ArrayList<>();

        listAdres.add(new Adres("Łanowa" , 34 , "90-134"));
        listAdres.add(new Adres("Traktorowa" , 14 , "93-534"));

        listAdres.add(new Adres("Plantowa" , 45 , "90-200"));
        listAdres.add(new Adres("Łanowa" , 35 , "90-137"));

        listAdres.add(new Adres("Plantowa" , 10 , "90-184"));
        listAdres.add(new Adres("Sępia" , 30 , "93-434"));

        listAdres.add(new Adres("Łanowa" , 2 , "90-128"));
        listAdres.add(new Adres("Sępia" , 22 , "93-429"));

        listAdres.add(new Adres("Szpitalna" , 10 , "97-134"));
        listAdres.add(new Adres("Szpitalna" , 20 , "97-145"));

        List<Adres>  copyListAdres = new ArrayList<>(listAdres);

        showList(copyListAdres);

        changeAllNameStreet(copyListAdres);

        showList(copyListAdres);

        List<Adres> sortCopyListAdres = new ArrayList<Adres>();
        sortCopyListAdres = sortByStreetNumber(copyListAdres);

        showList(sortCopyListAdres);

    }

    public static void showList(List<Adres> listAdres) {
        System.out.println();
        for (Adres adres : listAdres) {
            System.out.println(adres);
        }
    }

    public static void changeAllNameStreet(List<Adres> listAdres) {
        for (Adres adres: listAdres) {
            adres.setNameStreet("Jagiellońska");
        }
    }

    public static List<Adres> sortByStreetNumber(List<Adres> listAdres) {
        Comparator comparisonNumberStreet = new ComparisonNumberStreet();
        List<Adres> sortCopyListAdres = new ArrayList<Adres>(new ComparisonNumberStreet());
        return sortCopyListAdres;
    }

}

import java.util.Comparator;

public class ComparisonNumberStreet implements Comparator<Adres>{

@Override
public int compare(Adres o1, Adres o2) {
    if (o1.getNumber() > o2.getNumber()) {
        return 1;
    } else if (o1.getNumber() < o2.getNumber()) {
        return -1;
    } else {
        return 0;
    }
}

}


0

o_O

    public static List<Adres> sortByStreetNumber(List<Adres> listAdres) {
        Comparator comparisonNumberStreet = new ComparisonNumberStreet();
        List<Adres> sortCopyListAdres = new ArrayList<Adres>(new ComparisonNumberStreet());
        return sortCopyListAdres;
    }

Pokaż mi gdzie w tym kodzie używasz w ogóle tej listy listAdres. Bo ja widzę tylko utworzenie komparatora i utworzenie nowej, pustej listy. Co wiecej tworzysz tu 2 komparatory, nie wiadomo po co.
Zresztą ten kod się w ogóle nie skompiluje, bo takiego konstruktora listy nie ma.

ArrayList<T> ma metodę sort która przyjmuje komparator i sortuje w miejscu podaną listę. Masz też Collections.sort().

0

Hej,

Możesz to zrobić dość prosto używając lambd. Wtedy klasa Adres powinny implementować interfejs Comparable i zawierać metode:

public int compareTo(Object o) {
    Adres o2 = (Adres) o;
    if (this.getNumber() > o2.getNumber()) {
        return 1;
    } else if (this.getNumber() < o2.getNumber()) {
        return -1;
    } else {
        return 0;
    }
}

A potem już prosto. Korzystając podpowiedzi kolegi powyżej:

public static List<Adres> sortByStreetNumber(List<Adres> listAdres) {
        
        List<Adres> sortCopyListAdres = new ArrayList<Adres>(listAdres);
        Collections.sort(sortCopyListAdres, (Comparator<Adres>) (Adres a1, Adres a2) -> a1.compareTo(a2));
        return sortCopyListAdres;
    }

Mam nadzieje, że pomogło.

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