Sortowanie listy String przez liczby znajdujące się w nich

0

Siemanko.
Trochę się naszukałem już po internecie, ale niestety bez skutku.
Otóż, muszę odczytać dane z pliku. (W każdej linijce jest imię, nazwisko, wynagrodzenie, ew. linijka z jakimiś głupotami) i je posortować wynagrodzeniami.
Listę tworzę za pomocą FileReadera oraz Scannera.
while (scanner.hasNextLine() { String line = scanner.nextLine(); list.add(line) }
Wczytane linie wyglądają mniej więcej tak:
"Nowak, Jan 9521 zł; zlecenie
Pierzak, Janina 6758 zł; zlecenie "

Szukałem już różnych sposobów na posortowanie tego cenowo, ale po prostu nie dałem rady.
Samo Collections.sort to za mało.
// Gdyby to były obiekty z parametrami typu >name< >age< >earning< - to już na to sposób znalazłem z comparatorem.

Myślałem, żeby usunąc z pozycji wszystkie danie po za cyframi, ale muszę podać pełne dane 3 osób (imię, nazwisko, typ umowy łącznie z zarobkami).

Z góry dziękuję za pomoc :)

0

Wyciągnij regexem zarobki, jeśli nie masz we wczytywanych danych innych liczb niż zarobki to wystarczy ci pattern \d+. Wynik możesz zcastować na inta i użyć w customowym komparatorze.

0
iksde napisał(a):

Wyciągnij regexem zarobki, jeśli nie masz we wczytywanych danych innych liczb niż zarobki to wystarczy ci pattern \d+. Wynik możesz zcastować na inta i użyć w customowym komparatorze.

To łatwo zrobić i bez regeksa. Ale przecież napisał wyraźnie, że to nie rozwiązuje problemu:

Myślałem, żeby usunąc z pozycji wszystkie danie po za cyframi, ale muszę podać pełne dane 3 osób (imię, nazwisko, typ umowy łącznie z zarobkami).

Potrzebowałby regeksa, który sparsuje całość - wyciągając imię, nazwisko itd.

0
V-2 napisał(a):
iksde napisał(a):

Wyciągnij regexem zarobki, jeśli nie masz we wczytywanych danych innych liczb niż zarobki to wystarczy ci pattern \d+. Wynik możesz zcastować na inta i użyć w customowym komparatorze.

To łatwo zrobić i bez regeksa. Ale przecież napisał wyraźnie, że to nie rozwiązuje problemu:

Myślałem, żeby usunąc z pozycji wszystkie danie po za cyframi, ale muszę podać pełne dane 3 osób (imię, nazwisko, typ umowy łącznie z zarobkami).

Potrzebowałby regeksa, który sparsuje całość - wyciągając imię, nazwisko itd.

Ale mi chodzi o sam komparator. Niech posortuje tablicę stringów i wypisze po kolei - chyba na tym polega zadanie?

3

Gdyby to były obiekty z parametrami typu >name< >age< >earning< - to już na to sposób znalazłem z comparatorem.

No to zrób takie obiekty. Gdzie jest problem? Kto ci broni wziąć taką linię i ją sparsować i zamień na obiekt?


enum Type {
    ZLECENIE,
    UOP
}

class Person implements Comparable<Person> {
    private static final Pattern pattern = Pattern.compile("(\\w+), (\\w+) (\\d+).*; (\\w+)");
    private final String name;
    private final String surname;
    private final Integer earnings;
    private final Type type;

    Person(String line) {
        Matcher matcher = pattern.matcher(line);
        matcher.find();
        name = matcher.group(1);
        surname = matcher.group(2);
        earnings = Integer.valueOf(matcher.group(3));
        type = Type.valueOf(matcher.group(4).toUpperCase());
    }

    @Override
    public int compareTo(Person o) {
        return earnings.compareTo(o.earnings);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", surname='" + surname + '\'' +
                ", earnings=" + earnings +
                ", type=" + type +
                '}';
    }
}

public class Parser {
    public static void main(String[] args) throws IOException {
        List<Person> people = Files.lines(Paths.get("data.txt"))
                .map(Person::new)
                .sorted()
                .collect(Collectors.toList());
        System.out.println(people);
    }
}

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