# Vererbung mit Arraylist



## sh33p (11. Jan 2010)

```
public abstract class Konto {

String kontobezeichnung;
int kontostand;

public Konto(String kontobezeichnung, int kontostand){
this.kontobezeichnung = kontobezeichnung;
this.kontostand = kontostand;

}
abstract String getKontobezeichnung();

abstract int getKontostand();
}
public class Girokonto extends Konto{

int dispokredit;

public Girokonto(String kontobezeichnung, int kontostand, int dispokredit){
  super(kontobezeichnung,kontostand);
  this.dispokredit = dispokredit;
}
public int getKontostand(){
  return kontostand;
}
public String getKontobezeichnung(){
  return kontobezeichnung;
}


}
import java.util.*;
public class GiroKontoSortierer implements Comparator<Girokonto> {

public int compare(Girokonto g1, Girokonto g2){

if(g1.getKontostand() == g2.getKontostand()){
  return 0;
}

if(g1.getKontostand() > g2.getKontostand()){
return 1;
}

if(g1.getKontostand() < g2.getKontostand()){
  return -1;
}

return (g1.getKontostand()+ g2.getKontostand());
}
}
import java.util.*;
public class Kontoverwaltung {

  ArrayList<Girokonto> a;
  
  public Kontoverwaltung(){
    a = new ArrayList<Girokonto>();
  }
    public static void main(String[] args) {
    new Kontoverwaltung().test();
    }
          public void test(){
           a.add(new Girokonto("Sparkassenkonto deluxe",2000,2000));
           a.add(new Girokonto("Dresdener Bank small", 5000,10000));
           a.add(new Girokonto("Volksbank middle", 2000,4000));
           ausgabe();
          }
          
          public void ausgabe(){
          Iterator it = a.iterator();
            while(it.hasNext()){
           System.out.println(it.next());
           Collections.sort(a,new GiroKontoSortierer());
           
  }

}
          
}
```

im endeffekt hab ich 2 fragen:

1.wie veränder ich die methode ausgabe(),damit mir der inhalt des girokonto-objektes richtig angezeigt wird?

2. kann eine generische liste nicht mehr als 1 Argument aufnehmen? z.b wenn ein eine Klasse Kunde geben würde:

```
ArrayList<Girokonto,Kunde> a;
```

?


----------



## Der Müde Joe (11. Jan 2010)

>kann eine generische liste nicht mehr als 1 Argument aufnehmen? z.b wenn ein eine Klasse Kunde geben würde:

Nein. Es ist eine List von ??. Nicht eine Liste von ?? und @@.

>wie veränder ich die methode ausgabe(),

Überschreib die toString Methode.

Die ganze Ausgabe Methode ist eh ein wenig wirr. Über einen Iterator gehen und dann sortieren?
Wohl eher umgekehrt. Erst sortieren, dann darüber itereiren. Am besten mit for(Girokonto konto : a) {...}


----------



## Der Müde Joe (11. Jan 2010)

try it:


```
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public interface Account {

	int getBalance();
}

class DepositAccount implements Account, Comparable<DepositAccount> {

	private int money;

	public DepositAccount(int money) {
		this.money = money;
	}

	@Override
	public int getBalance() {
		return this.money;
	}

	@Override
	public String toString() {
		return "Deposit: " + money;
	}

	@Override
	public int compareTo(DepositAccount o) {
		return (o.money < money) ? 1 : (o.money > money) ? -1 : 0;
	}
}

class BankJob {

	private List<DepositAccount> accounts = new ArrayList<DepositAccount>();

	public BankJob() {
		init();
	}

	private void init() {
		accounts.add(new DepositAccount(100));
		accounts.add(new DepositAccount(300));
		accounts.add(new DepositAccount(200));
	}

	public void print() {
		Collections.sort(accounts);
		for (Account a : accounts) {
			System.out.println(a);
		}
	}

	public static void main(String... _) {
		BankJob bank = new BankJob();
		bank.print();
	}
}
```


----------



## sh33p (11. Jan 2010)

```
import java.util.*;
public class Kontoverwaltung {

  ArrayList<Girokonto> list;
  
  public Kontoverwaltung(){
    list = new ArrayList<Girokonto>();
  }
    public static void main(String[] args) {
    new Kontoverwaltung().test();

    }
          public void test(){
           list.add(new Girokonto("Sparkassenkonto deluxe",2000,2000));
           list.add(new Girokonto("Dresdener Bank small", 5000,10000));
           list.add(new Girokonto("Volksbank middle", 2000,4000));
          Collections.sort(list, new GiroKontoSortierer());
            print(list);
          }
          
          public static void print(List <Girokonto> konten){
          for( Girokonto g : konten)
          System.out.println( g.getKontostand()+g.getKontobezeichnung()+g.getDispoKredit());
           
  }


}
```

ohne toString() zu überschreiben.
btw.kannst du mir mal zeigen, wie ich den Iterator mit der toString methode schreibe?


----------



## Der Müde Joe (11. Jan 2010)

>ohne toString() zu überschreiben. 

Dafür musst du jetzt jedes Mal wenn du ein String vom Konto brauchst den ganzen Schnoder machen anstatt einfach konto.toString() ;-)

EDIT:
>btw.kannst du mir mal zeigen, wie ich den Iterator mit der toString methode schreibe? 

siehe Code oben.
Einfach toString überschreiben im Konto. Der Rest erledigt system.out.println
mit Iterator genau gleich
Iterator<Konto> it = accounts.iterator()
wihle(it.hasNext()) { System.out.println(it.next())}

syso ruft automatisch toString auf


----------



## sh33p (11. Jan 2010)

ok to String hab ich in girokonto überschrieben.

nur bei dem iterator hagelt es massen an compiler fehlern:


```
Iterator<Girokonto> it = list.iterator();
   while(it.hasNext()) {
   System.out.println(it.next());

   }
```


----------



## faetzminator (11. Jan 2010)

Was hagelts hier an Compilerfehlern? Das sollte 1:1 so funktionieren. Kannst du bitte die Fehlermeldung(en) posten?


----------



## sh33p (11. Jan 2010)

```
import java.util.*;
public class Kontoverwaltung {

  ArrayList<Girokonto> list;
  
  public Kontoverwaltung(){
    list = new ArrayList<Girokonto>();
  }
    public static void main(String[] args) {
    new Kontoverwaltung().test();

    }
          public void test(){
           list.add(new Girokonto("Sparkassenkonto deluxe",2000,2000));
           list.add(new Girokonto("Dresdener Bank small", 5000,10000));
           list.add(new Girokonto("Volksbank middle", 2000,4000));
           Collections.sort(list, new GiroKontoSortierer());
            print(list);
          }
          
          public static void print(List <Girokonto> konten){
          for( Girokonto g : konten)
          System.out.println( g.getKontostand()+g.getKontobezeichnung()+g.getDispoKredit());
           
  }
  Iterator<Girokonto> it = list.iterator();
   while(it.hasNext()) {
   System.out.println(it.next());

   }


}
}
```

fehler :

Kontoverwaltung.java:34: illegal start of type
   while(it.hasNext()) {
   ^
Kontoverwaltung.java:34: <identifier> expected
   while(it.hasNext()) {
                   ^
Kontoverwaltung.java:34: ';' expected
   while(it.hasNext()) {
                    ^
Kontoverwaltung.java:34: illegal start of type
   while(it.hasNext()) {
                     ^
Kontoverwaltung.java:34: <identifier> expected
   while(it.hasNext()) {
                      ^
Kontoverwaltung.java:34: ';' expected
   while(it.hasNext()) {
                        ^
Kontoverwaltung.java:35: illegal start of type
   System.out.println(it.next());
         ^
Kontoverwaltung.java:35: ';' expected
   System.out.println(it.next());
             ^
Kontoverwaltung.java:35: invalid method declaration; return type required
   System.out.println(it.next());
              ^
Kontoverwaltung.java:35: <identifier> expected
   System.out.println(it.next());
                             ^
Kontoverwaltung.java:35: ';' expected
   System.out.println(it.next());
                              ^
Kontoverwaltung.java:35: illegal start of type
   System.out.println(it.next());
                               ^
Kontoverwaltung.java:35: <identifier> expected
   System.out.println(it.next());
                                ^
Kontoverwaltung.java:35: ';' expected
   System.out.println(it.next());
                                 ^
Kontoverwaltung.java:41: class, interface, or enum expected
}
^
15 errors


----------



## faetzminator (11. Jan 2010)

Dein Code befindet sich auch nicht in einer Methode. Wann soll der ausgeführt werden?


----------



## sh33p (11. Jan 2010)

stimmt :lol:


----------



## sh33p (11. Jan 2010)

```
import java.util.*;
public class GiroKontoSortierer implements Comparator<Girokonto> {

public int compare(Girokonto g1, Girokonto g2){

if( g1.getKontostand() == g2.getKontostand()){
  if(g1.getDispoKredit() == g1.getDispoKredit()){
  return g1.getKontostand() + g2.getKontostand();
  }
  else {
    return g1.getDispoKredit() + g2.getDispoKredit();
  }
 }
 else if ( g1.getKontostand() > g2.getKontostand()){
   return 1;
 }
 else {
   return  -1;
 }
}
}
```

ich hab den GiroKontoSortierer erweitert und möchte erst nach dem Kontostand und dann nach dem dispokredit sortieren. hier habe ich nicht explizit angeben, was passiert wenn der dispokredit größer is als der andere..wie gehts jetzt weiter?wenn ich weitere if-abfragen starte,sagt mir der compiler unreachable statement


----------



## faetzminator (11. Jan 2010)

Davon ausgegangen, dass dies int's sind:

```
public int compare(Girokonto g1, Girokonto g2){
    if (g1.getKontostand() != g2.getKontostand()) {
        return g1.getKontostand() - g2.getKontostand(); // je nach auf- oder absteigend a - b oder b - a
    }
    return g1.getDispoKredit() - g2.getDispoKredit(); // hier ebenfalls
}
```


----------



## sh33p (11. Jan 2010)

ich könnte aber auch vereinfacht schreiben:

if(g1 != g2)....
?


----------



## Der Müde Joe (11. Jan 2010)

>return g1.getKontostand() - g2.getKontostand();

Das ist gefährlich. (Wenn man nahe an die MAX MIN kommt)
Besser < oder > benutzen


----------



## Der Müde Joe (11. Jan 2010)

```
public int compare(Girokonto g1, Girokonto g2){
    return (g1.getKontostand() > g2.getKontostand()) ? 1 : (g1.getKontostand() < g2.getKontostand()) ? -1 : 0;
}
```


----------



## sh33p (11. Jan 2010)

Der Müde Joe hat gesagt.:


> ```
> public int compare(Girokonto g1, Girokonto g2){
> return (g1.getKontostand() > g2.getKontostand()) ? 1 : (g1.getKontostand() < g2.getKontostand()) ? -1 : 0;
> }
> ```



kannst du das mal erklären?noch nie gesehen


----------



## Der Müde Joe (11. Jan 2010)

heisst ternärer Operator

(Bedingung) ? (wenn true) : (wenn false)

EDIT:
Java ist auch eine Insel – 2.8 Weitere Operatoren


----------



## faetzminator (11. Jan 2010)

Der Müde Joe hat gesagt.:


> Das ist gefährlich. (Wenn man nahe an die MAX MIN kommt)
> Besser < oder > benutzen



Oke, oke, hast natürlich recht


----------



## sh33p (11. Jan 2010)

okay. mir ist es aber erstmal ohne den ternären operator lieber:


```
import java.util.*;
public class GiroKontoSortierer implements Comparator<Girokonto> {

public int compare(Girokonto g1, Girokonto g2){
    if (g1 != g2) {
        return g1.getDispoKredit() - g2.getDispoKredit(); // je nach auf- oder absteigend a - b oder b - a
    }
    else{
      return g1.getKontostand() - g2.getKontostand(); // hier ebenfalls
}

}
}
```

wie sieht die abfrage weiter aus,wenn ich noch eine weitere variable z.b kontobezeichnung und eine 4. erstellungsdatum sortieren möchte?


----------



## faetzminator (11. Jan 2010)

1. Das else brauchst du nicht, da du in dem if einen [c]return[/c] hast.
2. [c]if (g1 != g2) {[/c] ist inkorrekt, mein Code ist korrekt.
3. 1:1 zu meinem Code Zeile 2 - 4, natürlich mit einem anderen Feld.


----------



## Der Müde Joe (11. Jan 2010)

>okay. mir ist es aber erstmal ohne den ternären operator lieber:

dann solltest du das so machen:

```
if((g1.getKontostand() > g2.getKontostand())) { return 1; }
else if((g1.getKontostand() < g2.getKontostand()) { return -1;}
else {return 0;}
```

>wie sieht die abfrage weiter aus,wenn ich noch eine weitere variable z.b kontobezeichnung und eine 4. erstellungsdatum sortieren möchte?

Wie definierst du dann was grösser ist? Ist ein Konto mit mehr Geld grösser als ein Konto mit weniger Geld, das aber eine kleinere Id hat?


----------



## sh33p (11. Jan 2010)

```
public int compare(Girokonto g1, Girokonto g2){
    if (g1.getKontostand() != g2.getKontostand()) {
        return g1.getKontostand() - g2.getKontostand(); // je nach auf- oder absteigend a - b oder b - a
    }
    return g1.getDispoKredit() - g2.getDispoKredit(); // hier ebenfalls
}
}
   if(g1.getKontobezeichnung() != g2.getKontobezeichung()){
    return g1.getKontoBezeichnung.compareTo(g2.getKontoBezeichnung());
  }
  return g1.getDatum().compareTo(g2.getDatum());
}
}
```

was is falsch?


----------



## faetzminator (11. Jan 2010)

```
public int compare(Girokonto g1, Girokonto g2) {
    if (g1.getKontostand() != g2.getKontostand()) {
        return g1.getKontostand() - g2.getKontostand(); // je nach auf- oder absteigend a - b oder b - a
    }
    if (g1.getDispoKredit() != g2.getDispoKredit()) {
        return g1.getDispoKredit() - g2.getDispoKredit(); // hier ebenfalls
    }
    if(!g1.getKontobezeichnung().equals(g2.getKontobezeichung())) { // hier haben wir ein Objekt!
        return g1.getKontoBezeichnung.compareTo(g2.getKontoBezeichnung());
    }
    return g1.getDatum().compareTo(g2.getDatum());
}
```


----------



## sh33p (11. Jan 2010)

wieso haben wir bei kontobezeichnung ein objekt?liegt es daran das kontobezeichnung vom typ string ist?


----------



## faetzminator (11. Jan 2010)

Ja, int's sind primitive Datentypen. String's sind Objekte


----------



## Der Müde Joe (11. Jan 2010)

>liegt es daran das kontobezeichnung vom typ string ist? 

Auch String ist ein Objekt. Wenn auch ein sehr spezielles.

Nur die primitiven Typen sind keine Objekte. Dass sind: byte, short, int, long, float, double , boolean , char.


----------

