# array list ausgeben



## max514 (29. Aug 2018)

Hey leute ich komm irgendwie nicht weiter ich hab die folgenden zwei classen geschrieben:


```
import java.util.ArrayList;
public class Kartei {
 
 
   public ArrayList<Freunde> liste = new ArrayList<Freunde>();
 


    public void anlegen(Freunde f) {
        liste.add(f);
    }

    public void anlegen(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
       String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl) {
        Freunde f = new Freunde (vorName, nachName, geburtsDatum, telefonNummer, handyNummer, email, postleitZahl,
        ort, strasse, key, gesamtanzahl);
        liste.add(f);
    }
 

 
    public void aendern () {
       liste.toString();
    }
 
    public void aendern(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl) {
       Freunde a = null;
       for (Freunde f : liste) {
           if (f.gethandyNummer()==handyNummer) {
               a = f;
               break;
           }
       }
       if(a!=null)
       liste.toString();
    }
 
    public void loeschen (Freunde fe) {
       liste.remove(fe);
    }
 
    public void loeschen (String nachName, String vorName) {
       Freunde lo = null;
        for (Freunde f : liste) {
                   if (f.getnachName().equals(nachName) || f.getvorName().equals(vorName)) {
                       lo = f;
                       break;
                   }
               }
       if(lo!=null)
       liste.remove(lo);
    }
 
    public void finde (Freunde f) {
       liste.toString();
    }
 
    public String finde(String nachName, String vorName) {
        for (Freunde f : liste) {
            if (f.getnachName().equals(nachName) || f.getvorName().equals(vorName)) {
                return f.toString();
            }
        }
        return null;
    }
 
    public void gesamtanzahl (Freunde f) {
       liste.size();
    }
 
    public String gesamtanzahl (String gesamtanzahl) {
       liste.size();
       return gesamtanzahl(gesamtanzahl);
    }
}
```

und die :


```
import javax.swing.JSpinner.ListEditor;

public class Freunde {
 
   private String vorName;
   private String nachName;
   private String geburtsDatum;
   private long telefonNummer;
   private long handyNummer;
   private String email;
   private long postleitZahl;
   private String ort;
   private String strasse;
   private int key;
   private int gesamtanzahl;
 
   public Freunde (String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl) {
       this.vorName = vorName;
       this.nachName = nachName;
       this.geburtsDatum = geburtsDatum;
       this.telefonNummer = telefonNummer;
       this.handyNummer = handyNummer;
       this.email = email;
       this.postleitZahl = postleitZahl;
       this.ort = ort;
       this.strasse = strasse;
       this.key = key;
       this.gesamtanzahl = gesamtanzahl;
       }


   public String getvorName(){
        return vorName;
    }

    public String getnachName(){
            return nachName;
    }
 
    public String getgeburtsDatum() {
           return geburtsDatum;
    }
 
    public long gettelefonNummer() {
       return telefonNummer;
    }
 
    public long gethandyNummer() {
       return handyNummer;
    }
 
    public String getemail() {
       return email;
    }
 
    public long getpostleitZahl() {
       return postleitZahl;
    }
 
    public String getort() {
       return ort;
    }
 
    public String getstrasse() {
       return strasse;
    }
 
 
 
    public void anlegen(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl) {
       this.vorName = vorName;
       this.nachName = nachName;
       this.geburtsDatum = geburtsDatum;
       this.telefonNummer = telefonNummer;
       this.handyNummer = handyNummer;
       this.email = email;
       this.postleitZahl = postleitZahl;
       this.ort = ort;
       this.strasse = strasse;
       this.key = key;
       this.gesamtanzahl = gesamtanzahl;
               }

    public void aendern(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl){
       this.vorName = vorName;
       this.nachName = nachName;
       this.geburtsDatum = geburtsDatum;
       this.telefonNummer = telefonNummer;
       this.handyNummer = handyNummer;
       this.email = email;
       this.postleitZahl = postleitZahl;
       this.ort = ort;
       this.strasse = strasse;
       this.key = key;
       this.gesamtanzahl = gesamtanzahl;
    }
 
   public void loeschen(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl) {
       this.vorName = vorName;
       this.nachName = nachName;
       this.geburtsDatum = geburtsDatum;
       this.telefonNummer = telefonNummer;
       this.handyNummer = handyNummer;
       this.email = email;
       this.postleitZahl = postleitZahl;
       this.ort = ort;
       this.strasse = strasse;
       this.key = key;
       this.gesamtanzahl = gesamtanzahl;
   }
 
   public String toString(){
        return    key + "Name :" + nachName + " Vorname: " + vorName + "Geburtsdatum: " + geburtsDatum +
               "Telefon: " + telefonNummer + "Handynummer: " + handyNummer + "E-amil: " + email +
               "Strasse: " + strasse + "PLZ: " + postleitZahl + "Ort: " + ort;
    }
 
   public String gesamtanzahl() {
       return "Gesamtanzahl der Einträge: " + gesamtanzahl;
   }  
    }
```

jetzt meine Frage wie kann ich namen in die liste einfügen und ausgeben lassen ??? ich hab mir das ungefähr so vorgestellt


```
import java.util.Scanner;

public class Main {

   public static void main(String[] args) {
      
       public static void main(String[] args) {
          
           boolean eingabe = false;
          
           while (eingabe == true) {
               int i;
               Scanner s = new Scanner(System.in);
               System.out.println("Anlegen einer Freundesliste.");
               System.out.println("Wählen sie eine der sechs möglichkeiten aus.");
               System.out.println("1: Einen neuen Freunde anlegen" );
               System.out.println("2: Einen Eintrag löschen" );
               System.out.println("3: Einen Eintrag ändern" );
               System.out.println("4: Einen Eintrag suchen" );
               System.out.println("1: Gesammtanzahl der Freunde ausgeben" );
               System.out.println("6: Freundesliste ausgeben" );
               i = s.nextInt();
              
               switch (i) {
               case 1:
                   break;

               default:
                   break;
               }
           }
```


----------



## looparda (29. Aug 2018)

In deiner Main hälst du eine Instanz der Kartei.

In case 1 implementierst du das Anlegen, indem du alle weiteren Details vom Benutzer abfragst, um den Konstruktor Freunde (String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer, String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl) aufrufen zu können. Die Instanz fügst du in deine Kartei ein. (an anderer Stelle wurde bereits vorgeschlagen die Klasse _Freunde _besser _Freund _zu nennen)
In case 6 iterierst du über die Einträge der Kartei und gibst sie aus oder sagst der Kartei, dass sie sich ausgeben soll.


----------



## max514 (29. Aug 2018)

Danke =) Freunde darf ich nicht ändern ist vorgegeben =D


----------



## max514 (29. Aug 2018)

```
switch (i) {
               case 1:
                   Scanner v = new Scanner(System.in);
                   vorName = v.nextLine();
                   break;
```

was mach ich falsch ?? eigentlich müsse er doch vorname kennen oder ??


----------



## looparda (29. Aug 2018)

max514 hat gesagt.:


> eigentlich müsse er doch vorname kennen oder ??


Nö. Wie kommst du darauf? Du willst eine neue Variable anlegen also mach es einfach.


----------



## max514 (29. Aug 2018)

ah ok vielen dank =)


----------



## max514 (29. Aug 2018)

also ich hab jetzt des geschrieben aber das funkt auch nicht kann  mir irgendjemand ein kleines beispiel zeigen damit ich verstehe wie das genau funktioniert ich komm einfach nicht drauf ??


```
Scanner v = new Scanner(System.in);
                   String vorName = v.nextLine();
                   String nachName = v.nextLine();
                   String geburtsDatum = v.nextLine();
                   long telefonNummer = v.nextLong();
                   long handyNummer = v.nextLong();
                   String email = v.nextLine();
                   long postleitZahl = v.nextLong();
                   String ort = v.nextLine();
                   String strasse = v.nextLine();
                   int key = v.nextInt();
                   Scanner v = Kartei.anlegen(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
                           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl);
                   break;
```

und im internet finde ich das nur ohne Scanner und da funkts dann und muss ich noch ne methode ohne gesamtzahl implementieren ??


----------



## looparda (29. Aug 2018)

Wo genau liegt das Problem?

```
import java.util.Scanner;

public class ReadExample {

    public static void main(String[] args) {
        new ReadExample().run();
    }

    private void run() {
        Scanner scanner = new Scanner( System.in );
        String vorName = scanner.nextLine();
        String nachName = scanner.nextLine();
        Person p = new Person(vorName, nachName);
        System.out.println(p);
    }

    private class Person {
        private String vorname;
        private String nachname;

        public Person(String vorname, String nachname) {
            this.vorname = vorname;
            this.nachname = nachname;
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Person{");
            sb.append("vorname='")
              .append(vorname)
              .append('\'');
            sb.append(", nachname='")
              .append(nachname)
              .append('\'');
            sb.append('}');
            return sb.toString();
        }
    }
}
```
Du gibst nacheinander mit Enter zwei Namen ein und dann wird die Person ausgegeben.


max514 hat gesagt.:


> Kartei.anlegen


Das deutet darauf hin, dass du keine Instanz von der Kartei in deiner Main hälst sondern irgendwas mit static machst.


----------



## max514 (29. Aug 2018)

ohh vielen dank des problem war das ich einfach nicht wusste wie ich das mach !! in den hundert videos die ich nir angeschaut hab war des alles nur mit sachen die ich schreib und nicht mit benutzereingabe und des ist meine erste aufgabe an der ich schon verzweifel =) danke für die mühe so kann ichs nachvollziehen =) jetzt noch die frage was bedeutet dieses append ??


----------



## looparda (30. Aug 2018)

max514 hat gesagt.:


> was bedeutet dieses append ??


In der toString-Methode benutze ich einen StringBuilder, um eine lesbare Repräsentation des Objekts mit seinen aktuellen Attributen zu bauen. Der StringBuilder ist eine Klasse, die performant Strings verketten kann. Das Verketten erfolgt via der append-Methode (also "anhängen").
Du kannst aber auch den "+"-Operator benutzen um Strings zu verketten:

```
@Override
public String toString() {
    return "Person{vorname='" + vorname + "', nachname='" + nachname + "'}";
}
```
Das ist jedoch nicht so performant wie mit dem StringBuillder.


----------



## mrBrown (30. Aug 2018)

looparda hat gesagt.:


> Du kannst aber auch den "+"-Operator benutzen um Strings zu verketten:
> 
> ```
> @Override
> ...



Das mit der Performance stimmt nur, wenn es um Konkatenierung in Schleifen geht.
Vor Java 9 wurde sowas zu StringBuillder-Aufrufen kompiliert, seit Java 9 zu StringConcatFactory.makeConcat[WithConstants], was besser optimierbar sein dürfte.


----------



## temi (30. Aug 2018)

Noch ein kleiner Hinweis:

```
public void anlegen(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl) {
       this.vorName = vorName;
       this.nachName = nachName;
       this.geburtsDatum = geburtsDatum;
       this.telefonNummer = telefonNummer;
       this.handyNummer = handyNummer;
       this.email = email;
       this.postleitZahl = postleitZahl;
       this.ort = ort;
       this.strasse = strasse;
       this.key = key;
       this.gesamtanzahl = gesamtanzahl;
               }

    public void aendern(String vorName, String nachName, String geburtsDatum, long telefonNummer, long handyNummer,
           String email, long postleitZahl, String ort, String strasse,int key, int gesamtanzahl){
       this.vorName = vorName;
       this.nachName = nachName;
       this.geburtsDatum = geburtsDatum;
       this.telefonNummer = telefonNummer;
       this.handyNummer = handyNummer;
       this.email = email;
       this.postleitZahl = postleitZahl;
       this.ort = ort;
       this.strasse = strasse;
       this.key = key;
       this.gesamtanzahl = gesamtanzahl;
    }
```

Die beiden Methoden machen exakt das selbe. "Anlegen" ist sowieso überflüssig, das machst du mit dem Konstruktor. Beim Ändern stellt sich die Frage, ob es sinnvoll ist, alle Felder gleichzeitig zu ändern oder ob einzelne Setter nicht die bessere Wahl wären.


----------



## max514 (31. Aug 2018)

ja dacht ich mir auch schon war mir aber nicht sicher ob das überflüssig ist =) noch ne frage ich kann die do while schleife nicht machen (er will ne variable) irgend ne idee ich muss die variable x (wie ich es gemacht hab) einlesen


```
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

import javax.security.auth.x500.X500Principal;

import org.omg.CORBA.PRIVATE_MEMBER;
import org.omg.CORBA.PUBLIC_MEMBER;

public class Main {


   public static String main(String[] args) {
     

         
         
         
           do {
               InputStreamReader isr = new InputStreamReader(System.in);
               BufferedReader br = new BufferedReader(isr);
               System.out.println("Anlegen einer Freundesliste.");
               System.out.println("Wählen sie eine der sechs möglichkeiten aus.");
               System.out.println("1: Einen neuen Freunde anlegen" );
               System.out.println("2: Einen Eintrag löschen" );
               System.out.println("3: Einen Eintrag ändern" );
               System.out.println("4: Einen Eintrag suchen" );
               System.out.println("1: Gesammtanzahl der Freunde ausgeben" );
               System.out.println("6: Freundesliste ausgeben" );
               String eingabe = br.readLine();
               int x = Integer.parseInt(eingabe);
             
               switch (x) {
               case 1:
                   Scanner v = new Scanner(System.in);
                   System.out.println("Vorname: ");
                   String vorName = v.nextLine();
                   System.out.println("Nachname: ");
                   String nachName = v.nextLine();
                   System.out.println("Geburtsdatum: ");
                   String geburtsDatum = v.nextLine();
                   System.out.println("Telefonnummer: ");
                   long telefonNummer = v.nextLong();
                   System.out.println("Handynummer: ");
                   long handyNummer = v.nextLong();
                   System.out.println("email: ");
                   String email = v.nextLine();
                   System.out.println("Postleitzahl: ");
                   long postleitZahl = v.nextLong();
                   System.out.println("Ort: ");
                   String ort = v.nextLine();
                   System.out.println("Strasse: ");
                   String strasse = v.nextLine();
                   Freunde p = new Freunde(vorName, nachName, geburtsDatum, telefonNummer, handyNummer, email,
                           postleitZahl, ort, strasse);
                   System.out.println(v);

                           final StringBuilder sb = new StringBuilder("Freunde{");
                           sb.append("vorname='")
                             .append(vorName)
                             .append('\'');
                           sb.append(", nachname='")
                             .append(nachName)
                             .append('\'');
                           sb.append('}');
                           return sb.toString();
                                         
             
           }
   }while (x<6);
 
}

}
```

also x geht nicht (bei while) ??


----------



## temi (31. Aug 2018)

Du deklarierst "x" innerhalb des do { ... } while-Blocks, damit ist sie außerhalb des Blocks nicht bekannt.


----------



## temi (1. Sep 2018)

Noch ein Tip:
Du deklarierst *innerhalb *der Schleife InputStreamReader, BufferedReader und Scanner jedesmal neu, das ist unnötig. Besser:

```
public class Main {
   private static Scanner scanner = new Scanner(System.in);

   public static String main(String[] args) {
      // hier code
      int value = scanner.nextInt();
      // mehr code
   }
```

Außerdem wäre es klug deinen Code in einzelne Methoden aufzuteilen:

```
public static String main(String[] args) {
   int userChoice;

   do{
      printMenu();
      userChoice = scanner.nextInt();

      switch (userChoice) {
         case 1: insertNewFriend();
         // code
   } while (userChoice < 6);
}

private static void printMenu() {
   // code
}

private static void insertNewFriend() {
   //code
}
```


----------

