TreeSet... Elemente verschwinden nach Sortierung

Hallo,

was mache ich hier falsch? Eigentlich sollte es über 300 Elemente geben, es werden aber nur 2 Zeilen ausgegeben:

    record DetailsElem(String s1, String s2, boolean api, TreeSet<String> concepts) {
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            DetailsElem that = (DetailsElem) o;
            return Objects.equals(s1, that.s1);
        }

        @Override
        public int hashCode() {
            return Objects.hash(s1);
        }
    }

    public static void filterAllowed() throws IOException {
        TreeSet<DetailsElem> details = new TreeSet<>((a, b) -> {
            List<String> list_a = a.concepts().stream().toList();
            List<String> list_b = b.concepts().stream().toList();
            for (int i = 0, j = 0; i < list_a.size() && j < list_b.size(); i++, j++) {
                int c = list_a.get(i).compareTo(list_b.get(j));
                if (c != 0) {
                    return 0;
                }
            }
            return list_b.size() - list_a.size();
        });

        JSONObject det = reqDetails();
        JSONArray data = det.getJSONArray("data");
        for (int i = 0; i < data.length(); i++) {
            JSONObject jo = data.getJSONObject(i);
            details.add(new DetailsElem(
                    jo.getString("symbol"),
                    jo.getString("displayNameEn"),
                    jo.getBoolean("apiAllowed"),
                    new TreeSet<>(jo.getJSONArray("conceptPlate").toList().stream().map(Object::toString).toList())
            ));
        }

        details.forEach(System.out::println);
    }

Das ist echt schräg…

So würde es funktionieren (es werden keine Elemente entfernt):

    record DetailsElem(String s1, String s2, boolean api, TreeSet<String> concepts) {
    }

    public static void filterAllowed() throws IOException {
        List<DetailsElem> details = new ArrayList<>();

        JSONObject det = reqDetails();
        JSONArray data = det.getJSONArray("data");
        for (int i = 0; i < data.length(); i++) {
            JSONObject jo = data.getJSONObject(i);
            details.add(new DetailsElem(
                    jo.getString("symbol"),
                    jo.getString("displayNameEn"),
                    jo.getBoolean("apiAllowed"),
                    new TreeSet<>(jo.getJSONArray("conceptPlate").toList().stream().map(Object::toString).toList())
            ));
        }

        details.sort((a, b) -> {
            List<String> list_a = a.concepts().stream().toList();
            List<String> list_b = b.concepts().stream().toList();
            for (int i = 0, j = 0; i < list_a.size() && j < list_b.size(); i++, j++) {
                int c = list_a.get(i).compareTo(list_b.get(j));
                if (c != 0) {
                    return 0;
                }
            }
            int c = Integer.compare(list_b.size(), list_a.size());
            if (c != 0) {
                return c;
            }
            return a.s1().compareTo(b.s1());
        });
        System.out.println(data.length());
        System.out.println(details.size());
        details.forEach(System.out::println);
    }

Aber wenn ich anstatt return a.s1().compareTo(b.s1()); return 0; schreibe, bekomme ich:

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!

Wie kann man das umgehen?

Ich möchte ja eben, dass nur nach der concepts-Liste sortiert wird, und falls diese gleich sind, soll nicht umsortiert werden.

Hat das etwas mit der Halbordnung zu tun?

Ich bin :pinched_fingers: so kurz davor, diesen Thread zu löschen und dich 2 Wochen zu sperren. Stell’ die Frage richtig, so dass man sie beantworten kann, oder lass’s diesen lächerlichen Versuch bleiben, so zu tun, als würdest du dich für irgendwelche technischen (Programmier-) Inhalte interessieren.

Du hast einen Versuch, im nächsten Beitrag eine gute, sinnvolle Frage zu stellen, sonsten … timeout.

Keinen Grund, sich aufzuregen. Wenn die Frage unerwünscht ist, dann bitte löschen. (Aber mich nicht sperren.)

Welche Informationen fehlen dir denn?

Keine gute, sinnvolle Frage → Sperre.
Aber nur bis Montag.
Also „Keinen Grund, sich aufzuregen“
1F595

Inzwischen gelöst,

da sollte ein return c; stehen (Typo).

Ich muss mich erst daran gewöhnen, dass das, was die AI vorschlägt, manchmal auch falsch sein kann. :sweat_smile: Und man auch solche Antworten gegenprüfen muss.

Steckt ja noch in den Kinderschuhen…

Genau wie manche Forenteilnehmer. :sweat_smile:

@Marco13 Der Schreibfehler war keine Absicht gewesen… Ist’s jetzt wieder gut?

  • nein -

@mogel Tut mir leid, mit dir spreche ich nicht mehr. Ich wurde schon mal deinetwegen gesperrt.

@mogel Bitte sag’ mir, was du gemacht hast :pleading_face: Ich will, dass er auch nicht mehr mit mir spricht. Aber *mit der flachen Hand ein paar mal seitlich an den Kopf haut* die Stimmen gehen nicht weg, und sie sagen dumme Sachen :frowning_face:

1 Like