Forum: PC-Programmierung Frage zu Java (array to string)?


von Kurt T. (kurtisblow)


Lesenswert?

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?

von Klaus K. (klkl)


Lesenswert?

Hallo

Kannst du die Definition von a noch dazu schreiben? Zahlenarray ist 
etwas ungenau.

Gruß Klaus

von Kurt T. (kurtisblow)


Lesenswert?

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);
      }
    }

von Kurt T. (kurtisblow)


Lesenswert?

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?

von Udo S. (urschmitt)


Lesenswert?

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.

von Klaus K. (klkl)


Lesenswert?

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

von Udo S. (urschmitt)


Lesenswert?

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.

von Kurt T. (kurtisblow)


Lesenswert?

So: public static int [] a;

von Udo S. (urschmitt)


Lesenswert?

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.

von Der dicke Holger (Gast)


Lesenswert?

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);

von Udo S. (urschmitt)


Lesenswert?

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!!!

von Der dicke Holger (Gast)


Lesenswert?

Alles nach "nur einmal" ignorieren bitte (der Code ist natürlich gültig) 
:D

von Udo S. (urschmitt)


Lesenswert?

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.

von Kurt T. (kurtisblow)


Lesenswert?

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);
    }
}

von Der dicke Holger (Gast)


Lesenswert?

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
}

von Udo S. (urschmitt)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

Poste doch mal deine Hausaufgabe.

von Kurt T. (kurtisblow)


Angehängte Dateien:

Lesenswert?

Ok, ja bin neu in Java, aber wir müssen plötzlich soviel in Java wie in 
C++ können.

von Kurt T. (kurtisblow)


Lesenswert?

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?

von Udo S. (urschmitt)


Lesenswert?

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

von Kurt T. (kurtisblow)


Lesenswert?

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?

von Udo S. (urschmitt)


Lesenswert?

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.

von Kurt T. (kurtisblow)


Lesenswert?

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));
  }

von Udo S. (urschmitt)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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)

von Kurt T. (kurtisblow)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

Hans Lüthi schrieb:
> Was soll nun noch falsch sein?

Debuggen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

von Udo S. (urschmitt)


Lesenswert?

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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

von Kurt T. (kurtisblow)


Lesenswert?

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.

von Kurt T. (kurtisblow)


Lesenswert?

Naja, ich komme nicht weiter, habe ich bereits beim erzeugen des Arrays 
alles falsch gemacht?

von Kurt T. (kurtisblow)


Lesenswert?

Vielen Dank, habe es schlussendlich doch noch geschafft :-D

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
Noch kein Account? Hier anmelden.