generischer swap

Sascha Laurent

Aktives Mitglied
Hallo Leute,

ich habe eine kleine Util - Klasse geschrieben

Java:
public class Utils<T extends Object & Comparable> {
       public void swap(T min, T max) {
    	   if ( min.compareTo(max) > 0) {
    		   T tmp = min;
    		   min   = max;
    		   max   = tmp;
    	   }
       }
}

und wollte diese Funktion von außen wie folgt aufrufen

Java:
Utils<Date>.swap(startdate, enddate);

Aber Eclipse meckert schon "Syntax error on token(s), misplaced construct(s)". Was mache ich falsch?
 

Illuvatar

Top Contributor
Vorerst: Das Ganze würde auch ohne Generics nicht funktionieren! Schau z.B. das hier mal an:
Java:
public class Utils {
       public static void swap(Date min, Date max) {
           if ( min.compareTo(max) > 0) {
               T tmp = min;
               min   = max;
               max   = tmp;
           }
       }
}

Wenn du jetzt [c]Utils.swap(startdate, enddate)[/c] aufrufst, ändert das nichts an den Variablen startdate und enddate! Nur die lokalen Variablen min und max werden vertauscht...

----------

Um dir trotzdem mit den Generics zu helfen: das müsste so aussehen:
Java:
public class Utils { // Die Klasse ist nicht generisch, nur die Methode
       // extends Object bringt nicht viel, und Comparable ist auch generisch
       // außerdem ist die Methode wohl static gedacht
       public static void <T extends Comparable<T>> doSomethingWith(T min, T max) {
           if ( min.compareTo(max) > 0) {
               //whatever
           }
       }
}
Aufruf mit [c]Util.doSomethingWith(startdate, enddate)[/c] (der generische Parameter wird automatisch bestimmt!).
 

Sascha Laurent

Aktives Mitglied
Vorerst: Das Ganze würde auch ohne Generics nicht funktionieren! Schau z.B. das hier mal an:
Java:
public class Utils {
       public static void swap(Date min, Date max) {
           if ( min.compareTo(max) > 0) {
               T tmp = min;
               min   = max;
               max   = tmp;
           }
       }
}

Wenn du jetzt [c]Utils.swap(startdate, enddate)[/c] aufrufst, ändert das nichts an den Variablen startdate und enddate! Nur die lokalen Variablen min und max werden vertauscht...

Ich weis, ich habe gelesen, das "call by reference" in Java nicht vorhanden ist, aber wie würde man denn sonst z.B. 2 oder mehrere Werte zurückgeben?

Um dir trotzdem mit den Generics zu helfen: das müsste so aussehen:
Java:
public class Utils { // Die Klasse ist nicht generisch, nur die Methode
       // extends Object bringt nicht viel, und Comparable ist auch generisch
       // außerdem ist die Methode wohl static gedacht
       public static void <T extends Comparable<T>> doSomethingWith(T min, T max) {
           if ( min.compareTo(max) > 0) {
               //whatever
           }
       }
}
Aufruf mit [c]Util.doSomethingWith(startdate, enddate)[/c] (der generische Parameter wird automatisch bestimmt!).
Und in "//whatever" dann

Java:
 T tmp = min;
 min   = max;
 max   = tmp;

oder stehe ich hier total auf dem Schlauch?

Danke
Sascha
 

Empire Phoenix

Top Contributor
Ich weis, ich habe gelesen, das "call by reference" in Java nicht vorhanden ist,

verbrenn das buch sofort!!!

Java macht für Objecte IMMER call by reference!!!
 

Sascha Laurent

Aktives Mitglied
Hallo Leute,

erstmal herzlichen Dank für eure Hilfe, aber ich stehe jetzt immer noch auf dem Schlauch. Wie muß es denn korrekt lauten, wenn man 2 oder mehrere Werte übergebene Werte innerhalb einer Funktion ändert, um diese von außen mit den neuen Werten zu benutzen.

Danke
Sascha
 

0x7F800000

Top Contributor
Gar nicht.
Erklär lieber, was du damit überhaupt vorhast. Es erscheint mir nämlich nicht nur unmachbar, sondern auch unnütz, als wäre es irgendein Workaround um irgendein Problem, das es gar nicht gibt. Wofür willst du solch eine Konstruktion verwenden?
 

Sascha Laurent

Aktives Mitglied
Also nochmal ;(

Angenommen ich habe eine Funktion z.B. swap(int a, int b). Diese Funktion soll zwei Werte vertausch. Wie würdet Ihr so eine Funktion realisieren? :eek:
 

eRaaaa

Top Contributor
Java:
    public static void main(String... args) {
	int[] array = {1,2,3,4,5};
	System.out.println(Arrays.toString(array));
	swap(array, 0, 4); //tausche 1 mit 5
	System.out.println(Arrays.toString(array));
    }

    public static void swap(int[] array, int indexA, int indexB) {
	int tmp = array[indexA];
	array[indexA] = array[indexB];
	array[indexB] = tmp;
    }

...
 

Sascha Laurent

Aktives Mitglied
Java:
    public static void main(String... args) {
	int[] array = {1,2,3,4,5};
	System.out.println(Arrays.toString(array));
	swap(array, 0, 4); //tausche 1 mit 5
	System.out.println(Arrays.toString(array));
    }

    public static void swap(int[] array, int indexA, int indexB) {
	int tmp = array[indexA];
	array[indexA] = array[indexB];
	array[indexB] = tmp;
    }

...

Danke :toll:
 

0x7F800000

Top Contributor
Angenommen ich habe eine Funktion z.B. swap(int a, int b). Diese Funktion soll zwei Werte vertausch. Wie würdet Ihr so eine Funktion realisieren? :eek:
In den letzten 10 Minuten hast du meine Sicht der Lage nicht entscheidend verändern können, die Antwort ist nach wie vor "Gar nicht". Das Konzept, dass man irgendwo irgendwas "swappen" soll, ist mir bisher nur bei einer handvoll nicht besonders praxisrelevanter Algorithmen und balancierten Bäumen untergekommen, und jedes mal müsste man das irgendwie anders implementieren, weil die Randbedingungen recht verschieden waren. Wozu brauchst du denn eine "allgemeine swap-methode", wenn man sie im Allgemeinen kaum braucht?

Edit: aah ja... arrays... Arrays gehören sowieso verboten. :autsch:

Wenn schon generisch, dann wohl eher so irgendwie? :
Java:
public static <T> void swap(T[] arr, int i, int j){
   T t = arr[i];
   arr[i] = arr[j];
   arr[j] = t;
}
 
Zuletzt bearbeitet:

Sascha Laurent

Aktives Mitglied
In den letzten 10 Minuten hast du meine Sicht der Lage nicht entscheidend verändern können, die Antwort ist nach wie vor "Gar nicht". Das Konzept, dass man irgendwo irgendwas "swappen" soll, ist mir bisher nur bei einer handvoll nicht besonders praxisrelevanter Algorithmen und balancierten Bäumen untergekommen, und jedes mal müsste man das irgendwie anders implementieren, weil die Randbedingungen recht verschieden waren. Wozu brauchst du denn eine "allgemeine swap-methode", wenn man sie im Allgemeinen kaum braucht?

Edit: aah ja... arrays... Arrays gehören sowieso verboten. :autsch:

Wenn schon generisch, dann wohl eher so irgendwie? :
Java:
public static <T> void swap(T[] arr, int i, int j){
   T t = arr[i];
   arr[i] = arr[j];
   arr[j] = t;
}

:oops: Es ging mir um das Wie nicht das Was.
Mich würde interessieren wieso, deiner Meinung nach, Arrays verboten gehören?:bahnhof:
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
:oops: Es ging mir um das Wie nicht das Was.
Die Antwort ist nach wie vor: es geht nicht.

Irgendwas in einem Array zu swappen ist selbstverständlich trivial.
Um aber zwei beliebige Objekt-Referenzen umzubiegen, müsstest du die halbe JVM auseinandernehmen, mit java-sprachmitteln ist sowas eben nicht machbar.

Bevor eRaaaa hier anscheinend irgendwas glücklich geraten hat, sind Begriffe wie "Array" oder "geordnete Sequenz" o.ä. gar nicht in der Diskussion aufgetaucht, und im allgemeinen ist es etwas schwierig, eine Frage richtig zu beantworten, die gar nicht gestellt wurde... :noe:
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Arrays sollten im normalen Code möglichst selten auftreten, weil sie einfach in die Sprache nicht reinpassen, und sich bei jeder Gelegenheit mit Collections, Iterable-Interfaces und Generics beißen. Sie gehören nur in lowlevelige Datenstrukturen wie ArrayLists und HashMaps verpackt, der Endbenutzer braucht davon aber eigentlich nichts zu wissen.

Wenn man den Code von anfang an ausschließlich mit collections schreibt, dann kann meistens nichts schief gehen. Wenn man irgendwo den Fehler macht, und irgendwo ein Array verwendet, stößt man irgendwann trotzdem auf irgendein Problem, wo man zB. assoziative Strukturen verwenden möchte, und ab da muss man entweder den ganzen alten Array-basierten Code neuschreiben, oder kleine nervige sinnlose Codeblöcke einfügen, die nichts anderes tun, als Arrays in Collections und Collections in Arrays zu übersetzen, und das nervt furchtbar.
 
Zuletzt bearbeitet:

Sascha Laurent

Aktives Mitglied
Arrays sollten im normalen Code möglichst selten auftreten, weil sie einfach in die Sprache nicht reinpassen, und sich bei jeder Gelegenheit mit Collections, Iterable-Interfaces und Generics beißen. Sie gehören nur in lowlevelige Datenstrukturen wie ArrayLists und HashMaps verpackt, der Endbenutzer braucht davon aber eigentlich nichts zu wissen.

Also, wie du schon richtig bemerkt hast, verwenden ArrayLists Arrays. Somit würde mich interessieren wie du z.B. intern eine ArrayList ohne Arrays realisieren willst? ???:L
 

mvitz

Top Contributor
Er hat doch gesagt, dass da Arrays rein gehören. Aber nicht in normalen Anwendungscode. Ich bin da seiner Auffassung. Es ist ok, dass ArrayList intern ein Array nutzt (das interessiert mich auch eher weniger), aber in deinem eigenen Code, solltest du wenn möglich keine Arrays benutzen, sondern lieber die Klassen des Collection Frameworks.
 

0x7F800000

Top Contributor
Also, wie du schon richtig bemerkt hast, verwenden ArrayLists Arrays. Somit würde mich interessieren wie du z.B. intern eine ArrayList ohne Arrays realisieren willst? ???:L
Ich habe doch genau das geschrieben: Arrays gehören nur in lowleveligen Code innerhalb von ArrayLists und HashMaps rein, außerhalb dieser Strukturen braucht man sie praktisch nicht mehr. Und als Otto Normalprogrammierer ist man nun mal eben nicht den ganzen Tag mit der Umgestaltung der Innereien von java.util.*-Klassen beschäftigt. Und deshalb braucht man sich den Chaos mit den Arrays nicht anzutun. Ansonsten finde ich es grundsätzlich schöner, wie das beispielsweise in Scala gemacht ist: Arrays sind Collections, sie sind normal Iterable, und sie werden normal generisch Typisiert, wie alles andere auch. Da gibt es daher gar keine Probleme, Arrays wie jede andere Datenstruktur zu verwenden. Aber in Java schleppt man eben aus kompatibilitätsgründen C-ähnliche Artefakte herum, was ja auch ok ist. Was ich aber nicht ok finde, ist der Eindruck, der vermittelt wird, dass man Arrays tatsächlich noch irgendwo verwenden sollte... Manche Bücher/Vorlesungen vermitteln diesen Eindruck imho.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Generischer Bubblesort Java Basics - Anfänger-Themen 19
M Generischer Array erstellen Java Basics - Anfänger-Themen 2
N Enum als generischer Typ Java Basics - Anfänger-Themen 4
S Frage zu generischer Liste Java Basics - Anfänger-Themen 3
P Liste sortieren verschiedener generischer Typen Java Basics - Anfänger-Themen 4
N Generischer Binärbaum - löschen Java Basics - Anfänger-Themen 1
S ClassCastException bei generischer Klasse Java Basics - Anfänger-Themen 5
M Collections Iterator und generischer Baum Java Basics - Anfänger-Themen 0
C Anwendung generischer Typparamter auf ArrayList Java Basics - Anfänger-Themen 2
J Generischer Typ - Array Java Basics - Anfänger-Themen 9
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
T Generisches Feld in nicht-generischer Klasse möglich? Java Basics - Anfänger-Themen 5
Helgon Polymorphie Generischer Methodenkopf - Erklärung Java Basics - Anfänger-Themen 3
E Generischer Methode ein Array übergeben Java Basics - Anfänger-Themen 3
J Frage zu generischer Klasse und Casten Java Basics - Anfänger-Themen 14
O Kleines Problem mit Konstruktor mit Parametern aus generischer Klasse...oder so ;) Java Basics - Anfänger-Themen 2
D Generischer Datentyp Java Basics - Anfänger-Themen 2
F (Generischer) Adapter Java Basics - Anfänger-Themen 8
T Generics: Generischer Konstruktor-Aufruf? Java Basics - Anfänger-Themen 17
S Frage zu generischer ArrayList Java Basics - Anfänger-Themen 6
X Rekursion & Generischer Datentyp Java Basics - Anfänger-Themen 11
G generischer binärbaum Java Basics - Anfänger-Themen 9
G Subtyp in generischer Klasse Java Basics - Anfänger-Themen 7
E Generischer Datentyp und Arrays Java Basics - Anfänger-Themen 3
T generischer stack Java Basics - Anfänger-Themen 3
ven000m Unterschied zwischen: ADT & generischer Programmierung Java Basics - Anfänger-Themen 2
E Swap Java Basics - Anfänger-Themen 18
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
NoMercy BitFlags Programm (switch on/off , swap und isSet) Java Basics - Anfänger-Themen 7
H Swap Methode Java Basics - Anfänger-Themen 1
J Swap Methode Java Basics - Anfänger-Themen 7
H Swap Java Basics - Anfänger-Themen 5
X swap in Java programmieren? Java Basics - Anfänger-Themen 12
G funktion swap Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben