Hallo, ich möchte folgendes: Ein einfaches Zahlenarray einem String zuordnen und den String ausgeben. Bisher habe ich folgendes probiert: //a ist mein Zahlenarray String newString = a.toString(); Der Compiler zeigt zwar keinen Fehler an, aber eine Wahrnung, dass die Zuweisung keine Wirkung hat. Was mache ich falsch?
Hallo Kannst du die Definition von a noch dazu schreiben? Zahlenarray ist etwas ungenau. Gruß Klaus
Hallo, das Array wird in einem Konstruktor erzeugt: public RandomArray(int length) { a = new int[length]; for (int i = 0; i<length; i++) { Random r = new Random(1000); a[i] = r.nextInt(1000); } }
Noch eine Zusatzfrage, wie ist es Möglich in eclipse ,wenn man mehrere .java files in einem Projekt hat, nur ein .java file auszuführen?
Die Definition von a fehlt immer noch. ich glaube du möchtest a als String ausgeben, aber a ist (wahrscheinlich) ein Array von Integer. Also musst du das programmieren. Ich würde dazu in der Klasse RandomArray die Methode toString() überschreiben und entsprechend implementieren.
Hallo Die Konvertierung ist eigentlich so gedacht: http://www.javahowto.de/sprache/strings/string-integer.html toString() ist wohl eher fürs debuggen. Habe Ich noch nicht verwendet. Gruß Klaus
Klaus Kloos schrieb: > toString() ist wohl eher fürs debuggen. toString() ist eine Methode der Basisklasse Object, von der alle Klassen abgeleitet sind. Sie ist oft nur so implementiert daß man nur einen Hashwert erhält. Der Sinn ist das man diese Klasse dann wenn es sinnvoll ist überschreibt.
Hans Lüthi schrieb: > Noch eine Zusatzfrage, wie ist es Möglich in eclipse ,wenn man mehrere > .java files in einem Projekt hat, nur ein .java file auszuführen? Es wird immer nur das eine main ausgeführt das in der Startklasse liegt, die du beim Ausführen angibst.
Quick & Dirty
1 | int length = 100; |
2 | int a[] = new int[length]; |
3 | |
4 | for (int i = 0; i<length; i++) { |
5 | Random r = new Random(1000); |
6 | a[i] = r.nextInt(1000); |
7 | } |
8 | |
9 | String y = ""; |
10 | for(int i = 0; i < a.length; i++) { |
11 | y += String.valueOf(a[i]); |
12 | } |
13 | |
14 | System.out.println(y); |
Übrigens nutzt du die Zufallszahlenerzeugung falsch, üblicherweise instanziiert man die nur einmal und holt sich dann
1 | int length = 100; |
2 | int a[] = new int[length]; |
3 | |
4 | Random r = new Random(1000); |
5 | for (int i = 0; i<length; i++) { |
6 | a[i] = r.nextInt(1000); |
7 | } |
8 | |
9 | String y = ""; |
10 | for(int i = 0; i < a.length; i++) { |
11 | y += String.valueOf(a[i]); |
12 | } |
13 | |
14 | System.out.println(y); |
Hans Lüthi schrieb: > So: public static int [] a; Und warum static, wenn du es in einem Konstruktor initialisierst? Ein Konstruktor wird durchlaufen wenn du ein konkretes Objekt einer Klasse instanziierst, die static Variable ist eine Eigenschaft der Klasse selbst, auch ohne daß ein konkretes Objekt der Klasse existiert. Alle Objekte teilen sich die eine static Variable!!!
Alles nach "nur einmal" ignorieren bitte (der Code ist natürlich gültig) :D
Der dicke Holger schrieb: > String y = ""; > for(int i = 0; i < a.length; i++) { > y += String.valueOf(a[i]); > } Geht ist aber sehr ineffizient, weil 1000 mal ein String erzeugt wird in den der vorherige Teil kopiert wird. Also wirklich quick and dirty. Besser wäre die Verwendung eines StringBuffer Objekts.
Danke erstmal, habe hier nun einemal den Gesammten code mit den Aufgaben und was ich bisher habe: import java.util.Random; public class RandomArray { /** * internal storage of the numbers */ public int [] a; public static void main() { System.out.println(a); } private int numbers[]; /** * Create a new array with random values between 0 and 1000 (exclusive). * * @param length the length of the new array. */ public RandomArray(int length) { a = new int[length]; for (int i = 0; i<length; i++) { Random r = new Random(1000); a[i] = r.nextInt(1000); } } /** * Return string-representation of array. * * Example: the string-representation of int array[] = {1,2,3} is '[1, 2, 3]' * * @return a list of the values, separated by a comma and a space, and enclosed in squared brackets. */ public String toString() { String newString = a.toString(); return newString; } /** * recursive sort of the array in descending order in place. * * @param until value between 0 and length (inclusive) of {@link RandomArray#numbers}. <br> * When the function returns the <em>until</em> largest values of {@link RandomArray#numbers} * are placed in the first <em>until</em> positions of the array and sorted in descending order. */ private void recursiveSort(int until) { } /** * sort the array in descending order in place. */ public void sort() { recursiveSort(numbers.length); } }
Ja, aber ich glaube der OP sollte sich erst etwas mehr in Java einarbeiten. Mir erschließt sich z.B. nicht warum der Zufallszahlengenerator immer einen Seed von 1000 erhält und somit bei jedem Durchlauf die gleiche Zahlenfolge erzeugt. Sinnvoller wäre
1 | Random r = new Random; |
2 | |
3 | for(...) { |
4 | a[i] = r.nextInt(1000); |
5 | } |
Der dicke Holger schrieb: > Ja, aber ich glaube der OP sollte sich erst etwas mehr in Java > einarbeiten. Jepp, das tut er wohl gerade. @Hans. Wenn du in deinem main nichts machst passiert auch nichts. Du solltest dir zumindest mal ein Objekt RandomArray instanziieren. Du kannst nicht in der static Methode auf eine nonstatic variable zugreifen. jetzt verstehe ich das static von oben. Sorry aber du musst dich hier einlesen. static gehört zur Klasse nicht static gehört zu eionem Objekt. Objekt instanziieren und dann methoden aufrufen. Das ist 2. Kapitel direkt nach Hello World in jedem Java Buch! Ohne Buch gehts nicht.
Ok, ja bin neu in Java, aber wir müssen plötzlich soviel in Java wie in C++ können.
So habe mal nach der "dirty" Holger Methode implementiert: public String toString() { String newString = "["; for(int i = 0; i < a.length; i++) { newString += String.valueOf(a[i]); if (i != (a.length -1)) { newString += ","; } } newString += "]"; return newString; } Wie kann ich nun eine Classe in der Konsole ausgeben, ohne dass es mir gerade alles noch in anderen Klassen nicht implementierte als Fehler anzeigt?
Hans Lüthi schrieb: > Wie kann ich nun eine Classe in der Konsole ausgeben, ohne dass es mir > gerade alles noch in anderen Klassen nicht implementierte als Fehler > anzeigt? Du machst dir ein eigenes Projekt und hast dort nur deine Aufgabe drin. Alle Klassen müssen funktionieren bevor du das Programm laufen lassen kannst. Aber du hast doch nur eine Klasse und die hat ihr main() als Einsprungspunkt. mach doch mal:
1 | public static void main(String[] args) throws Exception { |
2 | |
3 | RandomArray mainObj = new RandomArray(10); |
4 | mainObj.sort(); |
5 | mainObj.toString(); |
6 | }
|
Den Rest machst du jetzt bitte selbst
So, bin schon ziemlich weiter gekommen, danke an alle. Noch eine Frage zum recursiveSort. Bisher habe ich folgendes Programmiert: private void recursiveSort(int until) { int storage1; int storage2; for (int i = a.length; i >= 0; i--) { if (a[i] >= a[i-1]) { storage1 = a[i]; storage2 = a[i-1]; a[i] = storage2; a[i-1] = storage1; } } if (until > 0) { recursiveSort(until - 1); } } Ich kann leider das Array nicht ausgeben, daher weiss ich nicht, ob ich auf dem Holzweg bin oder nicht. Kann jemand sagen, ob ich nahe am Ziel bin, das Array absteigend zu sortieren?
Hans Lüthi schrieb: > Ich kann leider das Array nicht ausgeben, daher weiss ich nicht, ob ich > auf dem Holzweg bin oder nicht. Kann jemand sagen, ob ich nahe am Ziel > bin, das Array absteigend zu sortieren? Dann schreibe dir die toString Methode zuerst. In deiner rekursiven Sort Methode solltest du nur bis "until" sortieren und nicht immer bis a.length. Das gibt sonst einen Stack Overflow. Ausserdem musst du in der Rekursion eine Abbruchbedingung haben. Rate mal welche (hat mit until) zu tun. Nachtrag: Du hast die Abbruchbedingung implizit. Ist also OK und gibt auch keinen Stack Overflow.
Die toSort methode habe ich fertig. Ich dachte folgendes reicht als Abbruchbeddinung: if (until > 0) { recursiveSort(until - 1); } (Sobald until == 0 -> keine Rekursiven Aufrufe mehr, oder?) Nachtrag, ok, aber die vorgegebenen Tests sind immer noch nicht erfüllt. Sortiert meine Methode nicht richtig? Die Tests lauten: @Test public void sortEmpty() { RandomArray a = new RandomArray(0); a.sort(); String s = a.toString(); Assert.assertEquals("[]", s); } @Test public void sortOne() { RandomArray a = new RandomArray(1); a.sort(); String s = a.toString(); final String pattern = open + number + close; Assert.assertTrue("string '" + s + "' is not well formed",s.matches(pattern)); }
Hans Lüthi schrieb: > Sortiert meine Methode nicht richtig? Du hast einen richtig guten Debugger in Eclipse, benutze ihn schau dir deine Sortierroutine step für step an dann siehst du was passiert und was falsch ist. So lernst du es am besten.
Noch was. Ich würde zum Testen keine Zufallszahlen erzeugen, sondern einen 2. Konstruktor machen (Einen ohne Parameter) der mir einfach feste Zahlen in fester Reihenfolge in das Array mit fester Größe legt. Nur so hast du definierte Testbedingungen für mehrere Debugger Durchläufe. Wie groß das Array dann ist und welche Werte legst du halt beim Testen immer direkt im Code fest. Nach dem Test kannst du den Konstruktor wegwerfen oder zumindest auskommentieren (für spätere Fehlersuche)
So, ich denke ich habe es fertig implementiert: private void recursiveSort(int until) { int storage1; int storage2; for (int i = (a.length-1); i >= ((a.length - until)+1); i--) { if (a[i] >= a[i-1]) { storage1 = a[i]; storage2 = a[i-1]; a[i] = storage2; a[i-1] = storage1; } } if (until > 1) { recursiveSort(until - 1); } } Zumindest habe ich es einfachheitshalber in C++ überprüft und es scheint alles i.O zu sein. Das Problem ist nur, dass es die vorgegebenen Test immer noch nicht erfüllt. Was soll nun noch falsch sein?
Hans Lüthi schrieb: > So, ich denke ich habe es fertig implementiert: Was heißt "du denkst"? Du hast einen Computer vor dir und was der zb ganz besonders gut kann, ist Ausgaben auf eine Konsole zu machen. Spicke deinen Code mit Ausgabeanweisungen, so dass du übersichtlich nachvollziehen kannst, was wann warum passiert und teste erst mal mit kleinen Arrays, so in der Größenordnung von 5 oder 10 Zahlen. Damit verfolgst du, wie dein Code arbeitet und was er macht. Daraus ziehst du deine Schlüsse, findest raus wo du dich vertan hast und korrigierst das dann. Und nebenbei lernst du auch noch, wie die Ausgaben in Java gemacht werden :-) Sorry. Aber genau so lernst du Programm-Entwickeln. Alles andere ist sinnlos. Du musst lernen dir selbst zu helfen. Wenn dir hier jeder Logikfehler vorgebetet wird, dann hat die ganze Übung keinen Zweck.
Hans Lüthi schrieb: > Was soll nun noch falsch sein? Debuggen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Wenn ich mir das anschaue:
1 | for (int i = (a.length-1); i >= ((a.length - until)+1); i--) |
2 | ...
|
3 | storage2 = a[i-1]; |
dann rollen sich mir die Fussnägel auf. Was passiert hier bei deinen 2 Testcases mit einem Array der Größe 1 und einem der Größe 0??????? DEBUGGEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
So habe mal die Funktion emptyArray gedebuggt, sehr viel exeption throws. Nun, ich sehe ein, dass dies bei einem Array der Grösse 0 oder 1 nicht funktionieren kann.
Naja, ich komme nicht weiter, habe ich bereits beim erzeugen des Arrays alles falsch gemacht?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.