Autor Beitrag
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 18:07 
Hallo Programmierfreunde!

Zum (vorerst?) letzten Male habe ich ein Anliegen, das ich allein nicht gelöst bekomme.

Es geht mal wieder darum, einen Sortieralgorithmus zu starten, diesmal mal wieder in Java.

Ausgangspunkt war ein Eclipse-Projekt, in dem ich schon andere Sortieralgorithmen zum Laufen brachte (Anhang), es geht auf Eure dankenswerte Hilfe zurück.

Für die Sortierprozedur "TimSort" in der Mainprozedur sind zwei Variablen zu übergeben - eine zu sortierende Datenstruktur und ein (Comparable-)Comparator. Zu meinem Erstaunen akzeptiert die Eclipse ein einfaches Integerarray als Parameter für die zu sortierenden Datenstruktur. Jedoch fangen beim Comparator die Probleme an. Trotz stundenlangen Lesens und Probierens fand ich bisher nichts, was die Eclipse zufriedenstellt. In meiner Not "stibitze" ich einen Comparator aus der schon implementierten Klasse

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private static class ComparableComparator
    implements Comparator
    {
    public int compare(Object o1, Object o2)
      {
      Comparable c1 = (Comparable) o1;
      Comparable c2 = (Comparable) o2;
      return c1.compareTo(c2);
      }
    }


doch der funktioniert nicht, weil er sich auf Objekte allgemeiner Art bezieht, ich benötige hingegen einen Int-Comparator.

Auf den Datentyp "int" umgeschrieben:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private static class ComparableComparator
    implements Comparator
  {
    public int compare(int o1, int o2)
    {
      Comparable c1 = (Comparable) o1;
      Comparable c2 = (Comparable) o2;
      return c1 < c2 ? -1 : c1 > c2 ? +1 : 0;
    }
  }


moniert der JIT-Compiler

Zitat:
The type HelloWorld.ComparableComparator must implement the inheritec abstract method Comparable.Comparator(Object, Object).


und außerdem die letzte Codezeile.

Eine andere aufgegabelte Version:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
class IntComparator implements Comparator<Integer> {

      @Override
      public int compare(Integer v1, Integer v2) {
          return v1 < v2 ? -1 : v1 > v2 ? +1 : 0;
      }
  }



wird zwar vom Compiler akzeptiert, funktioniert jedoch nicht als übergebbarer Comparator. Die Eclipse moniert:

Zitat:
The method sort(T[], Comparator <? super T> in the type TimSort is not applicable for the arguments (int[], Comparator)


Paßt also auch nicht.

Kurzum, jetzt bin ich mit meinem kleinen Latein am Ende.

Weiß jemand Hilfe zum Erfolg, bitte?

Vielen Dank und Gruß

Delphi-Laie
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1455
Erhaltene Danke: 252

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 12.06.17 18:30 
Guten Abend Delphi-Laie,

eine TObjectList() wäre eine Alternative, oder eine eigenständige (statische) Klasse, die Objekte vergleicht.

Hoppala, die möchtest den bestehenden Comparator() in Java für Integer anpassen?! Dafür bedarf es keienrlei Anpassungen, denn "Object" gilt für so ziemlich alles in Java, ebenso für Integer

_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 18:49 
Vielen Dank, Frühlingsrolle!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
eine TObjectList() wäre eine Alternative,


Eine Delphi-Objektliste? Ich quäle mich doch durch Java!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
oder eine eigenständige (statische) Klasse, die Objekte vergleicht.


Die ist doch schon enthalten:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private static class ComparableComparator
    implements Comparator
    {
    public int compare(Object o1, Object o2)
      {
      Comparable c1 = (Comparable) o1;
      Comparable c2 = (Comparable) o2;
      return c1.compareTo(c2);
      }
    }


user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Hoppala, die möchtest den bestehenden Comparator() in Java für Integer anpassen?! Dafür bedarf es keienrlei Anpassungen, denn "Object" gilt für so ziemlich alles in Java, ebenso für Integer


Zu schön, um wahr zu sein. Bei mir klappt es natürlich nicht:

ausblenden Quelltext
1:
2:
3:
int[] myArray = {5, 4, 3, 2, 1};     
Comparator c = new ComparableComparator(); 
TimSort.sort(myArray, c );


Der Compiler moniert an der letzten Zeile:

Zitat:
The method sort(T[], Comparator <? super T> in the type TimSort is not applicable for the arguments (int[], Comparator)


so, wie ich oben schon schrieb.

Ratloser Gruß

Delphi-Laie
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1455
Erhaltene Danke: 252

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 12.06.17 19:31 
Eine kleine Hintergrund-Information dazu:

ausblenden Java-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
    /* @param   o the object to be compared.
     * @return  a negative integer, zero, or a positive integer as this object
     *          is less than, equal to, or greater than the specified object.
     *
     * @throws NullPointerException if the specified object is null
     * @throws ClassCastException if the specified object's type prevents it
     *         from being compared to this object.
     */

    public int compareTo(T o);

// siehe dazu:

static class MyComparator
    implements Comparator
{
    @Override
    public int compare(Object o1, Object o2)
    {
        Comparable c1 = (Comparable) o1;
        Comparable c2 = (Comparable) o2;
        return c1.compareTo(c2);
    }
}

D.h.:
- Ist c1 > c2 ... Rückgabewert +1
- Ist c1 = c2 ... Rückgabewert 0
- Ist c1 < c2 ... Rückgabewert -1

Als Beispiel:

ausblenden Java-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
import java.util.*;   // für den Comparer
import javax.swing.*; // für den Dialog

// ...

public static void main(String[] args) {
    int zahl1 = 13;
    int zahl2 = 12;
    MyComparator mc = new MyComparator();
    int ergebnis = mc.compare(zahl1, zahl2);
    JOptionPane.showMessageDialog (null, ergebnis, "Ergebnis", JOptionPane.INFORMATION_MESSAGE);
    // Wert +1 wird zurückgeliefert 
}


Nachtrag:

Habe einen Blick auf den Dateianhang geworfen, und ja, du wirst die Comparator() Klasse sowie die Compare() Methode darauf anpassen müssen.
Ungefähr so:

ausblenden Java-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
static class MyComparator
    implements Comparator<Integer>
{
    @Override
    public int compare(Integer i1, Integer i2) {
        return Integer.compare(i1, i2);
    }
}

// Aufruf
public static void main(String[] args) {
    Integer[] zahlen = {63754};
    MyComparator mc = new MyComparator();
    TimSort.sort(zahlen, mc); // oder 
    TimSort.sort(zahlen, new MyComparator());
    // Werte im Anschluss auslesen 
}

_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 21:32 
Hallo Frühlingsrolle, nochmals vielen Dank!

Die -1, 0 und +1 als Ergebnis der Vergleichsoperationen sind mir durchaus bekannt.

ausblenden Java-Quelltext
1:
2:
TimSort.sort(zahlen, mc); // oder 
TimSort.sort(zahlen, new MyComparator());


Ja, und genau das ist ja das Problem: Die Eclipse akzeptiert diese Form der Comparator-Übergabe nicht. Links ist bei beiden Zeilen ein rotes Quadrat mit weißem Kreuz, also eine Fehlermeldung vorhanden. Bei beiden kann ich den Meldungstext (ich schreibe ihn nunmehr zum dritten Male):

Zitat:
The method sort(T[], Comparator <? super T> in the type TimSort is not applicable for the arguments (int[], Comparator)


abgreifen.

Trotz Deiner Mühe und Hilfsbereitschaft bin ich bisher, was die Lösung des eigentlichen Problems anbetrifft, nicht einen Zehntelmillimeter weitergekommen.

Dein Beispiel mit der Ausgabe funktioniert wenigstens. Nur ist diese Compare-Funktion anscheinend mit dem Integerarray inkompatibel.

Gruß

Delphi-Laie

Ergänzung: Vielleicht hilft es ja weiter, hier zu zeigen, was die automatische Codevervollständigung anbietet, wenn ich "TimSort." eingebe (Anhang): Sie möchte als Comparator ein "<? super T> c" haben. Was zum Teufel ist das?? c ist die Variable, die wohl beliebig sein kann, T steht für Timsort, der übrige Typ ist allerdings völlig kryptisch: Fragezeichen als Kurzform von if-else..."super" ist ein Schlüsselwort für die Vererbung..hm..also wohl dem "inherited" äquivalent.

nächste Ergänzung: Taucht weit oben in der TimSort-Klasse auf:

ausblenden Java-Quelltext
1:
private final Comparator<? super T> c;					
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1455
Erhaltene Danke: 252

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 12.06.17 22:19 
Ich habe das Beispiel nun nachträglich unter Netbeans und Eclipse (4.6.2) getestet, und es hat funktioniert.
Wenn du auf alles bedacht hast (Projektdatei, Package, Klasse), sollte es ca. so aussehen:

java_Timsort

ausblenden TimSortTest.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
package timsortpackage;

import java.util.*;

public class TimSortTest {
  
  static class MyComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer i1, Integer i2) {
      return Integer.compare(i1, i2);
    }
  }

  public static void main(String[] args) {
    
      Integer[] zahlen = {63754};
      TimSort.sort(zahlen, new MyComparator());
      String s = "";
      for (Integer i : zahlen)
        s += i; 
      System.out.println(s);
            // Console: 34567
  }

}
Einloggen, um Attachments anzusehen!
_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)

Für diesen Beitrag haben gedankt: Delphi-Laie
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18460
Erhaltene Danke: 1560

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 12.06.17 22:23 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
The method sort(T[], Comparator <? super T> in the type TimSort is not applicable for the arguments (int[], Comparator)
Das ist auch korrekt. IntComparator implementiert einen Comparator<Integer>, dein Array enthält statt Werten vom Typ Integer aber Werte vom Typ int.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 22:36 
Frühlingsrolle, mir ist leider auch anhand Deiner Bilder nicht klar, was Du geändert hast, wenn das Projekt bei Dir funktioniert. Immerhin habe ich auch die Eclipse 4.6.2, scheint wohl noch die aktuelle Version zu sein.

Meinst Du mit "funktioniert", daß es mit TimSort compiliert und auch sortiert? Falls ja, könntest Du mir bitte Dein funktionierendes Projekt zukommen lassen?
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 22:44 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
The method sort(T[], Comparator <? super T> in the type TimSort is not applicable for the arguments (int[], Comparator)
Das ist auch korrekt. IntComparator implementiert einen Comparator<Integer>, dein Array enthält statt Werten vom Typ Integer aber Werte vom Typ int.


OK, tausend Dank, Sebastian!

Ich versuche mal, meine innere Explosion soweit wie möglich für mich zu behalten. "int" und "Integer", und dann auch noch zueinander inkompatibel, das ist einfach zu schön, um es schon nach wenigen Jahren vergessen zu haben.

Immerhin kann ich nun TimSort fehlerfrei mit Parametern aufrufen, zumindest im JIT-Compiler. Nun stehe ich allerdings vor dem Problem, ein Integer-Array dafür zu kreieren. Leider kann ich jetzt nicht

ausblenden Quelltext
1:
integer zahlen[] = {5,4,3,2,1};					


oder

ausblenden Quelltext
1:
integer[] zahlen = {5,4,3,2,1};					


schreiben, wäre ja auch zu schön gewesen.

Natürlich kann ich auch nicht

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
static class MyComparator
    implements Comparator<Integer>
  {
    @Override
    public int compare(Integer i1, Integer i2) {
        return Integer.compare(i1, i2);
    }
  }


von "integer" nach "int" umschreiben, denn das wäre ja eine mögliche Lösung gewesen, aber Java verweigert auch diese mir gegenüber hartnäckig. Die Welt könnte so herrlich schwierig sein, wenn sie nicht so wunderbar einfach wäre.

Vielen Dank und Grüße

Delphi-Laie


Zuletzt bearbeitet von Delphi-Laie am Di 13.06.17 13:54, insgesamt 5-mal bearbeitet
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1455
Erhaltene Danke: 252

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 12.06.17 22:47 
Das Projekt kompiliert fehlerfrei und in der Console scheint das sortierte Ergebnis auf.
Einloggen, um Attachments anzusehen!
_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 23:01 
Vielen Dank!

Warum

ausblenden Quelltext
1:
Integer[] zahlen = {6, 3, 7, 5, 4};					


bei Dir funktioniert, aber in meinem "HelloWorld" nicht (siehe meinen voherigen Beitrag), ist eines der vielen Rätsel. Das Geheimnis dahinter kann die Eclipse aber meinetwegen für sich behalten....

Leider kann ich Dein Projekt, nachdem ich es gerade so eingeladen bekam - endlich mal etwas ohne rote Fehlermeldungen an den Zeilenanfängen - nicht zum Laufen bringen. Drücke ich auf das Symbol "Weißer Pfeil auf grünem Kreis", erscheint nur ein Fehlermeldungsfenster:

"Editor does not contain a main type".

Herrlich!

Edit: Ein Fehler ist gefunden, es muß natürlich "Integer" statt "integer" heißen.


Zuletzt bearbeitet von Delphi-Laie am Mo 12.06.17 23:21, insgesamt 1-mal bearbeitet
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 23:03 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
The method sort(T[], Comparator <? super T> in the type TimSort is not applicable for the arguments (int[], Comparator)
Das ist auch korrekt. IntComparator implementiert einen Comparator<Integer>, dein Array enthält statt Werten vom Typ Integer aber Werte vom Typ int.


Noch eine Ergänzung dazu: Mir war eine "gewisse Inkompatibilität" auch klar, nur bezog ich diese ständig darauf, daß das eine zwei Integerwerte, das andere jedoch ein Integerarray ist (es wurde ja ständig "int[]" angezeigt.

Eine aussagekräftige Compilerfehlermeldung bezüglich Inkompatibilität zwischen "int" (und nicht "int[]) und "Integer" hätte Wunder gewirkt.


Zuletzt bearbeitet von Delphi-Laie am Di 13.06.17 13:55, insgesamt 1-mal bearbeitet
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1455
Erhaltene Danke: 252

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 12.06.17 23:19 
Das kommt gelegentlich (in Eclipse) vor, wenn man mit fremden Projekten handhabt, deren Klassenname sich vom Projektnamen unterscheidet. Entweder benennst du die Klasse TimSortTest in TimeSortProjekt um, oder du setzt den Cursor auf die main() Methode und drückst Strg+F11, oder du erzeugst eine neue Klasse und selektierst die Checkbox (public static main ...) und kopierst den Quelltext nochmal rein bzw. schreibst ihn neu. :D

_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 188


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 12.06.17 23:29 
Nö, nicht nötig, ich habe jetzt Deinen entscheidenden Quelltext in mein "HelloWorld" kopiert. Es läuft!!

Das mit dem "integer" statt "Integer" geht natürlich völlig auf meine Kappe (diese Groß-Kleinschreibungsnachlässigkeit kommt daher, wenn man Programmiersprachen gewöhnt ist, denen das egal ist), aber der aus meiner Sicht nicht ausreichenden Fehlermeldung des Compilers bin ich immer noch gram.

Zum Debuggen werde ich die Eclipse ausreichend benutzen, das tat ich mit C-artigen Algorithmen schon einige Male, aber für eigenes Programmieren dem Delphi untreu werde ich nunmehr erst recht nicht.

Vielen Dank nochmal Euch beiden!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18460
Erhaltene Danke: 1560

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.06.17 07:13 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Zum Debuggen werde ich die Eclipse ausreichend benutzen, das tat ich mit C-artigen Algorithmen schon einige Male, aber für eigenes Programmieren dem Delphi untreu werde ich nunmehr erst recht nicht.
Ich persönlich benutze übrigens eher Netbeans. Eclipse habe ich im Studium benutzt, Addons eingebunden für Gui-Design usw., aber alles was ich brauche liefert Netbeans schon out-of-the-box. Ich habe nicht mehr genug Zeit um diese in die Konfiguration der IDE zu stecken. Deshalb bin ich da umgeschwenkt.

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Für diesen Beitrag haben gedankt: Delphi-Laie