Frage zu Java (array to string)?

#2592055
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?
Gast #2592078
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);
#2592079
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!!!
#2592085
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);
    }
}
Gast #2592088
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
}
#2592109
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.
#2592130
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?
#2592143
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
#2592272
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?
#2592288
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.
#2592292
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));
  }
#2592310
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)
#2592368
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?
#2592404
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren