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, 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);
}
}
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.
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.
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!!!
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
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.
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:
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.
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.