Rekursive swapArray Methode

Diskutiere Rekursive swapArray Methode im Java Basics - Anfänger-Themen Bereich.
J

jono

Hallo zusammen,
die Aufgabe lautet:
Java:
Gegeben ist die Signatur der Methode swapArray in Functionality.java.

Implementieren Sie eine REKURSIVE Methode, die zwei Index-Werte und zwei Integer-Arrays erhält.
Die Methode soll von dem Index "from" (inklusive) bis zum Index "to" (inklusive) die Werte an den gleichen Indexstellen aus den beiden Arrays tauschen. Der Rückgabewert ist die tatsächliche Anzahl der Vertauschungen.
Bsp.:
Mit den Arrays
  a = new int[]{5, 1, 2, 8, 6, 9}
  b = new int[]{42, 34, 68, 21, 12, 47, 82}
liefert der Aufruf swapArray(1, 4, a, b); den Wert 4, da es vier Vertauschungen gibt.
Nach dem Aufruf sehen die Arrays wie folgt aus:
a = [5, 34, 68, 21, 12, 9]
b = [42, 1, 2, 8, 6, 47, 82]

Folgende Spezialfälle sind zu beachten:
- Wenn einer der Arrays null ist, so wird 0 zurückgegeben
- Wenn "from" negativ, größer als "to" oder größer als die Länge eines Arrays ist, so wird 0 zurückgegeben.
- Wenn "to" größer als die Länge-1 des kleinsten Arrays ist, so wird die Länge-1 des kleinsten Arrays für "to" verwendet.
- "from" und "to" sind inklusive, d.h. die Werte an den Indexstellen "from" und "to" müssen ebenfalls getauscht werden.
Dazu habe ich folgenden Quellcode:
Java:
public class Functionality {
 public static int swapArray(int i, int j, int[] a, int[] b) {
  if (a == null || b == null) {
   return 0;
  }
  if (i < 0 && i > j || i > a.length || i > b.length) {
   return 0;
  }
  if (a.length < b.length) {
   if (i > a[1]) {
    i = a[1];
   }
   if (b.length < a.length) {
    if (i > b[1]) {
     i = b[1];
    }
   }
   for (j = 0; j < b.length; j++) {
    for (i = 0; i < a.length; i++) {
     a[i] = b[j];
     b[j] = a[i];
    i = j;
    j = i;
    }
   }
  }
  swapArray();
  return
 }
}
Mein Problem ist:
Bei den beiden for-Schleifen wird zwar irgendwo das tauschen erfüllt, aber ich durchdringe einfach nicht, wie
ich jetzt das from-to Problem lösen kann.
 
mihe7

mihe7

Mein Problem ist:
Dein Problem ist, dass man bei Dir auch nach Wochen nicht erkennen kann, dass Du irgendein Verständnis für die Programmierung entwickelt hättest.

Bei den beiden for-Schleifen wird zwar irgendwo das tauschen erfüllt,
Wenn die beiden for-Schleifen das Tauschen erfüllen, fress ich 'nen Besen.

aber ich durchdringe einfach nicht, wie
ich jetzt das from-to Problem lösen kann.
Du durchdringst schon nicht, dass man swapArray() nicht ohne Parameter aufrufen kann, dass Du keine for-Schleife brauchst/haben sollst (Rekursion!) und wie man zwei Elemente in Arrays tauscht.

Wenn Du da wirklich weitermachen willst, löse folgende Aufgaben:
1. schreibe eine rekursive Methode, die die Zahlen von i bis 10 (jeweils inkl.) ausgibt.
Java:
public static void zeigeZahlen(int i) { ... }
2. erweitere die Methode um den Parameter j, so dass alle Zahlen von i bis j (jeweils inkl.) ausgegeben weren
Java:
public static void zeigeZahlen(int i, int j) { ... }
3. erweitere die Methode derart, dass die Anzahl der ausgegebenen Zahlen(i bis j) zurückgegeben wird:
Java:
public static int zeigeZahlen(int i, int j) { ... }
 
J

jono

Ja, ich versuche jetzt die Aufgabe zu lösen.
Und mir ist bewusst, dass man diese ohne Parameter nicht aufrufen kann.
Außerdem habe ich das mit der Rekursion noch nicht ganz drauf, erstes mal halt.
Und ich finde, dass du Nicht einfach behaupten kannst, ich hätte nach Wochen kein Verständnis
dafür entwickelt, finde ich etwas überzogen, ich bekomme jetzt einige Aufgaben alleine hin zumindest
und habe auch vieles verstanden? Kannst du doch daraus jetzt nicht ableiten. und jede Aufgabe war
von der Thematik her eine neue auch wenn sich Dinge in anderen Themen überschneiden, trotzdem
ist deine Aussage sehr oberflächlich
 
J

jono

mit den for schleifen war ich mir auch nicht sicher, deshalb wollte ich ja auch mal nachfragen, um zu wissen ob das bullshit ist.
Aber was sagst du denn was die for Schleife hier in mit den Anweisungen in dem Fall hier macht ? Würde mich echt mal
interessieren.
 
J

jono

Das return ist natürlich auch noch offen, ist auch klar dass das so nicht fertig wäre
 
mihe7

mihe7

du Nicht einfach behaupten kannst, ich hätte nach Wochen kein Verständnis
dafür entwickelt
Zum einen habe ich das nicht behauptet, ich habe geschrieben, dass man es nicht erkennen kann. Zum anderen wäre eine solche Behauptung auch nicht aus der Luft gegriffen; ich erinnere mich z. B. an den 2D-Array-Thread. Wenn Du Dir Deinen Code anschaust, würdest Du sagen, dass dieser von irgendeinem Verständnis bzgl. der Arrays zeugt?

jede Aufgabe war
von der Thematik her eine neue auch wenn sich Dinge in anderen Themen überschneiden, trotzdem
ist deine Aussage sehr oberflächlich
Mit dem feinen Unterschied, dass die neue Thematik in Deinem Code gar keine Rolle spielt: Du hast eine iterative "Lösung" für ein Problem angegeben, das vom Schwierigkeitsgrad her knapp über dem Kopieren eines Arrays in ein anderes liegt. Diese Lösung enthält nicht einfach nur ein, zwei Fehler - was durchaus vorkommen kann - sondern ist dermaßen falsch (s. u.), dass man nicht mal erahnen kann, welche Idee dahinterstecken könnte.

Aber was sagst du denn was die for Schleife hier in mit den Anweisungen in dem Fall hier macht ? Würde mich echt mal
interessieren.
Erstens bekommst Du i und j übergeben, die Du dann mal eben auf 0 setzt und iterierst dann über das gesamte Array. Zweitens auch noch verschachtelt. Drittens kopierst Du mit dem Code im Rumpf der inneren Schleife einen Wert von Array b, Position j, nach Array a, Position i. Anschließend kopierst Du den Wert, den Du eben kopiert hast, wieder zurück. Mal abgesehen davon, dass der zweite Schritt vollkommen überflüssig ist, wird der Wert von a[i] verloren bleiben. Viertens kopierst Du dann j nach i, was dazu führt, dass die innere Schleife niemals terminiert, wenn a wenigstens zwei Elemente enthält.
 
J

jono

Java:
public class Functionality{
 
    public static void swapArray(int[] dataA, int[] dataB, int from, int to) {
        if (from > to || dataA.length <= from || dataB.length <= from)
            return;
        int tmp = dataB[from];
        dataB[from] = dataA[from];
        dataA[from] = tmp;
        swapArray(dataA, dataB, ++from, to);
       
    }
   
}
Im Prinzip so ? Nur wie erhalte ich jetzt die Anzahl

:rolleyes:
 
J

jono

Dann müsste ich ja void durch int ersetzen und das "return;" auch mit einem int rückgabetyp umändern?
 
J

jono

Java:
public class Functionality{
 
    public static int swapArray(int[] dataA, int[] dataB, int from, int to) {
     if(dataA == null || dataB == null) return 0;
     
        if (from < 0 && from > to || dataA.length < from || dataB.length < from)
            return 0;
        int tmp = dataB[from];
        dataB[from] = dataA[from];
        dataA[from] = tmp;
        swapArray(dataA, dataB, ++from, to);
       
    }
   
}
Muss vor das swapArray noch ein return?
 
J

jono

Also wird halt vorgeschlagen vom Programm, aber ich meiner Intuition nach macht es nicht wirklich Sinn.
Ich muss doch jetzt irgendwie noch die Anzahl der Vertauschungen definieren, oder?
 
J

jono

Java:
/root/autocorrectorBNQIZIdir/PublicTests.java:15: error: incompatible types: int cannot be converted to int[]        
 assertEquals(4, Functionality.swapArray(1, 4, a, b));

/root/autocorrectorBNQIZIdir/PublicTests.java:28: error: incompatible types: int cannot be converted to int[]        
 assertEquals(1, Functionality.swapArray(3, 3, a, b));

/root/autocorrectorBNQIZIdir/PublicTests.java:41: error: incompatible types: int cannot be converted to int[]        
assertEquals(6, Functionality.swapArray(1, 400, a, b));

/root/autocorrectorBNQIZIdir/PublicTests.java:50: error: incompatible types: int cannot be converted to int[]        
assertEquals(0, Functionality.swapArray(0, 0, a, b));

/root/autocorrectorBNQIZIdir/PublicTests.java:54: error: incompatible types: int cannot be converted to int[]      
  assertEquals(0, Functionality.swapArray(0, 0, c, d));

/root/autocorrectorBNQIZIdir/PublicTests.java:62: error: incompatible types: int cannot be converted to int[]        
assertEquals(0, Functionality.swapArray(-2, 3, a, b));

/root/autocorrectorBNQIZIdir/PublicTests.java:63: error: incompatible types: int cannot be converted to int[]       
assertEquals(0, Functionality.swapArray(4, 3, a, b));

/root/autocorrectorBNQIZIdir/PublicTests.java:64: error: incompatible types: int cannot be converted to int[]        
assertEquals(0, Functionality.swapArray(9, 12, a, b));
Das sind die Fehlermeldungen.
 
J

JustNobody

Also es ist doch der Methodenkopf vorgegeben worden:
Java:
 public static int swapArray(int i, int j, int[] a, int[] b) {
(So habe ich zumindest den ersten Satz der Aufgabe verstanden ("Gegeben ist die Signatur der Methode swapArray in Functionality.java.")

Also ist es schon eine gute Leistung, diesen vorgegebenen Part anzupassen. (Und der Fehler besagt ja auch nichts anderes. Er versucht die Methode aufzurufen nur der erste Parameter ist nun ein int und der kann er nicht in ein array von Ints umwandeln ....

Und ein paar einfache Hinweise, die Du wirklich beherzigen solltest:
a) Wenn eine Methode einen Wert zurück gibt, dann nutz ihn auch. Es gibt nur sehr selten den Fall, dass dies anders ist.
b) Als Anfänger solltest Du NIEMALS den ++ Operator innerhalb von anderen Statements aufrufen. Du hast Probleme, Code zu übersehen und dann ist sowas garantiert Kontraproduktiv. Ein swapArray(dataA, dataB, ++from, to) ist also etwas, das in meinen Augen schlicht idiotisch ist!
c) Parameter sind eine Eingabe und sollten nicht verändert werden. Das ist evtl. am Anfang etwas blöd, vor allem wenn es scheint, als ob da schon fast dazu aufgefordert wird (".. so wird ... für "to" verwendet.") Das ist aber ähnlich blöd wie der Punkt b. Wenn Du eine Eingabe bereinigen musst, dann hab einen Parameter eingabe und von mir aus eine Variable bereinigteEingabe.

Das einfach einmal als kleine Hilfestellung ... über den Punkt c) mag man ja gerne diskutieren wollen, aber a und b solltest Du beherzigen. Und wenn Du bei a) einen Rückgabewert nicht nutzt, dann hab eine gute Begründung dafür parat, warum Du diesen hier einfach weg wirfst.
 
J

jono

Ja, dann hab ich doch richtig gedacht, dass es, steht ja auch da dass int nicht in int[] komvertiert werden kann. Hatte ich übrigens auch schon geändert
 
R

Rahza

Wie in der Aufgabe vorgegeben wurde, soll für den Fall, dass das Array null ist, 0 zurückgegeben werden.

Hierzu eine allgemeine Frage:
Reicht bei sowas die Abfrage if (array == null)?
Oder sollte auch array.length == 0 bzw. die Tatsache, dass array==null für alle i gesprüft werden?
 
Zuletzt bearbeitet:
J

jono

Wie hättest du es dann gemacht statt des ++-Operators?
Gute Frage @Rahza, habe ich mich auch gefragt
 
J

jono

Aber laut meiner Fehlermeldung dürfte es nicht so sein
@JustNobody Wie ist das denn jetzt mit dem Rückgabetyp?
Java:
return swapArray(++from, to, dataA, dataB);
Wenn ich das zurückgebe, reicht das ja noch nicht aus.
Vielleicht eine kleine Hilfestellung wie ich darauf komme, was genau ich jetzt zurückgeben muss?
Verstehe was dahintersteckt, nur wie ich die Anzahl der Vertauschungen jetzt definiere ist mir ziemlich
unersichtlich
 
Zuletzt bearbeitet:
Thema: 

Rekursive swapArray Methode

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben