Java, Utilities

Collection-Klassen, I18N


Collections

Interfaces:

Klassen:

Collection

Collection, Set, List

Collection:

public interface Collection

  public boolean add(Object o)
  public boolean remove(Object o)
  public boolean contains(Object o)
  public Iterator iterator()

Iterator:

public interface Iterator

  public boolean hasNext()
  public Object next()

List: Duplikate sind zugelassen

public interface List
extends Collection

  public boolean add(Object o)
  public Object get()
  public boolean remove(Object o)
  public boolean contains(Object o)
  public Iterator iterator()

Set: keine Duplikate enthalten

public interface Set
extends Collection

  public boolean add(Object o)
  public boolean remove(Object o)
  public boolean contains(Object o)
  public Iterator iterator()

Comparator: Vergleichsmethode bei Sorted*

public interface Comparator

int compare(Object o1, Object o2) 

boolean equals(Object obj) 
Map

Map, SortedMap

Map: (Schlüssel,Wert)-Paare

public interface Map

  public boolean put(Object key, Object value)
  public Object get(Object key)
  public boolean remove(Object key)
  public boolean containsKey(Object key)
  public boolean containsValue(Object value)
  public Set keySet()

Objekte, die als Schlüssel (key) verwendet werden, müssen folgende Bedingungen erfüllen:

Beispiel: Konten als HashMap

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry;

public class Konten {

    private HashMap konten = null;

    public Konten() {
	konten = new HashMap();
    }

    public void buche(int nummer, double betrag) {
        Integer n = new Integer(nummer);
        Object v = konten.get(n);
        double s = 0.0;
        if (v instanceof Double) {
	    s = ((Double)v).doubleValue();
	} 
        konten.put(n, new Double(s+betrag));
    }

    public double stand(int nummer) {
        Integer n = new Integer(nummer);
        Object v = konten.get(n);
        Double s = null;
        if (v instanceof Double) {
	    s = (Double) v;
	} else {
	    s = new Double(0.0);
	}
	return s.doubleValue();
    }

    public String toString(int nummer) {
	String s = "";
        s += "<Konto"; 
	s += " nummer='" + nummer + "'";
	s += " stand='" + stand(nummer) + "'";
	s += " />";
	return s;
    }

    public String toString() {
	String s = "";
        s += "<Konten >\n"; 
        for (Iterator i = (konten.keySet()).iterator(); i.hasNext(); ) {
            Object e = i.next();
            Integer n = (Integer)e;
	    int nummer = n.intValue();
	   s += toString(nummer) + "\n";
	}
	s += "</Konten>";
	return s;
    }
}

Collections: statische Hilfsmethoden

public class Collections
extends Object

static int binarySearch(List list, Object key) 
static int binarySearch(List list, Object key, Comparator c) 

static void copy(List dest, List src) 
static void fill(List list, Object obj) 

static int indexOfSubList(List source, List target) 
static int lastIndexOfSubList(List source, List target) 

static Object max(Collection coll) 
static Object max(Collection coll, Comparator comp) 

static Object min(Collection coll) 
static Object min(Collection coll, Comparator comp) 

static List nCopies(int n, Object o) 
static boolean replaceAll(List list, Object oldVal, Object newVal) 

static void reverse(List list) 
static Comparator reverseOrder() 

static void rotate(List list, int distance) 
static void shuffle(List list) 
static void shuffle(List list, Random rnd) 

static void sort(List list) 
static void sort(List list, Comparator c) 

static void swap(List list, int i, int j) 

Beispiel: Konten als HashMap mit Generics von JDK 1.5

import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;

public class Konten {

    private Map<Integer,Double> konten = null;

    public Konten() {
	konten = new HashMap<Integer,Double>();
    }

    public void buche(int nummer, double betrag) {
        double s = 0.0;
        if ( konten.get(nummer) != null ) {
           s = konten.get(nummer); 
        }
        konten.put(nummer, (s+betrag) );
    }

    public double stand(int nummer) {
        double s = konten.get(nummer);
	return s; 
    }

    public String toString(int nummer) {
	String s = "";
        s += "<Konto"; 
	s += " nummer='" + nummer + "'";
	s += " stand='" + stand(nummer) + "'";
	s += " />";
	return s;
    }

    public String toString() {
	String s = "";
        s += "<Konten >\n"; 
        for (Iterator<Integer> i = (konten.keySet()).iterator(); i.hasNext(); ) {
            int nummer = i.next();
	    s += toString(nummer) + "\n";
	}
	s += "</Konten>";
	return s;
    }

}

Date

java.util.Date stellt Datum und Uhrzeiten dar.
Die Zeit wird als Millisekunden seit dem 1. Januar 1970, 0 Uhr gespeichert. Fast alle Methoden sind 'deprecated'.

public class Date
extends Object
implements Serializable, Cloneable, Comparable

  public Date()
  public Date(long millis)

  public long getTime()
  public void setTime(long millis)

  public boolean after(Date a)
  public boolean before(Date a)
  public boolean equals(Date a)

Beispiel: Zeitstempel in einem Buchungssatz

(vonKonto, nachKonto, Betrag, Zeitstempel)

import java.util.Date;

public class BuchungDate implements BuchungInterface {

    final static int NO_KONTO = -1;

    protected int vonKonto = NO_KONTO;
    protected int nachKonto = NO_KONTO;

    protected double betrag = 0.0;

    protected Date zeitStempel = null;

    public BuchungDate(int von, int nach, double b) {
        vonKonto = von;
        nachKonto = nach;
        betrag = b;
        zeitStempel = new Date();
    }

    public int getVonKonto() { return vonKonto; }

    public int getNachKonto() { return nachKonto; }

    public double getBetrag() { return betrag; }

    public Date getZeit() { return zeitStempel; }

    public boolean vor(BuchungInterface b) {
	return zeitStempel.before( b.getZeit() );
    }

    public boolean nach(BuchungInterface b) {
	return zeitStempel.after( b.getZeit() );
    }

    public String toString() {
        String s = "<BuchungDate";
        s +=  " von='"+vonKonto+"'";
        s +=  " nach='"+vonKonto+"'";
	s +=  " betrag='"+betrag+"'";
	s +=  " zeit='"+zeitStempel+"'";
	s +=  " />";
	return s;
    }
}

das verwendete Interface:

import java.util.Date;

public interface BuchungInterface {

    public int getVonKonto();

    public int getNachKonto();

    public double getBetrag();
    public Date getZeit();

    public boolean vor(BuchungInterface b);
    public boolean nach(BuchungInterface b);
}

Test Programm

    static void testDate() {

        Screen sc = new Screen();
        KeyBoard kb = new KeyBoard();
        String s = "";

        BuchungInterface a = new BuchungDate(1,9,50.0);
	try {
            sc.println("press enter to continue");
            s = kb.readLine();
	}
	catch(IOException e) { }
        BuchungInterface b = new BuchungDate(9,2,100.0);

        sc.println("a = " + a);
        sc.println("b = " + b);

        boolean t = a.vor(b);
        sc.println("t = " + t);
        t = a.nach(b);
        sc.println("t = " + t);

        sc.println();
    }

Ausgabe

press enter to continue

a = <BuchungDate von='1' nach='9' betrag='50.0' zeit='Sun Dec 16 17:02:49 CET 2001' />
b = <BuchungDate von='9' nach='2' betrag='100.0' zeit='Sun Dec 16 17:02:50 CET 2001' />
t = true
t = false

Calendar und DateFormat

java.util.Calendar stellt Datum und Uhrzeit unabhängig von den o.g. Millisekunden dar.
Objekte der abstrakten Klasse können nicht per Konstruktor erzeugt werden, sondern es gibt eine Methode getInstance() die ein Objekt der Klasse liefert.

public abstract class Calendar
extends Object
implements Serializable, Cloneable

  public static Calendar getInstance()
  public static Calendar getInstance(TimeZone t, Locale l)

  public final Date getTime()
  public final void setTime(Date d)

  public final TimeZone getTimeZone()
  public final void setTimeZone(TimeZone t)

  public final int get(int feld)
  public final void set(int feld, int wert)
  public final void add(int feld, int wert)
  public final void roll(int feld, int wert)

  public static final int YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, ..., DAY_OF_YEAR, ...

  public final void set(int jahr, int monat, int tag)
  public final void set(int jahr, int monat, int tag, int stunde)
  public final void set(int jahr, int monat, int tag, int stunde, int minute)
  public final void set(int jahr, int monat, int tag, int stunde, int minute, int sekunde)

  public boolean after(Object a)
  public boolean before(Object a)
  public boolean equals(Object a)

java.util.GregorianCalendar erweitert die Klasse Calendar.

import java.util.Date;
import java.util.Calendar;
import java.text.DateFormat;

public class BuchungCalendar implements BuchungInterface {

    final static int NO_KONTO = -1;

    protected int vonKonto = NO_KONTO;
    protected int nachKonto = NO_KONTO;

    protected double betrag = 0.0;

    protected Calendar zeitStempel = null;
    protected DateFormat zeitFormat = null;

    public BuchungCalendar(int von, int nach, double b) {
        vonKonto = von;
        nachKonto = nach;
        betrag = b;
        zeitStempel = Calendar.getInstance();
        zeitStempel.setTime( new Date() );
        zeitFormat = DateFormat.getDateTimeInstance(
                        DateFormat.FULL,
                        DateFormat.FULL);
    }

    public int getVonKonto() { return vonKonto; }

    public int getNachKonto() { return nachKonto; }

    public double getBetrag() { return betrag; }

    public Date getZeit() { return zeitStempel.getTime(); }

    public boolean vor(BuchungInterface b) {
	return zeitStempel.before( b.getZeit() );
    }

    public boolean nach(BuchungInterface b) {
	return zeitStempel.after( b.getZeit() );
    }

    public String toString() {
        String s = "<" + getClass().getName();
        s +=  " von='"+vonKonto+"'";
        s +=  " nach='"+nachKonto+"'";
	s +=  " betrag='"+betrag+"'";
	s +=  " zeit='"+zeitFormat.format(zeitStempel.getTime())+"'";
	s +=  " />";
	return s;
    }
}

java.text.DateFormat formatiert Datum und Uhrzeit entsprechend einer Sprach- und Landes-Einstellung java.util.Locale.

Auch die Objekte dieser abstrakten Klasse können nicht per Konstruktor erzeugt werden, sondern es gibt Methoden getInstance() die ein Objekt der Klasse liefern.
public abstract class DateFormat
extends Format

  public static final DateFormat getInstance()

  public static final DateFormat getDateInstance()
  public static final DateFormat getTimeInstance()
  public static final DateFormat getDateTimeInstance()

  public static final DateFormat getDateInstance(int dStyle)
  public static final DateFormat getTimeInstance(int tStyle)
  public static final DateFormat getDateTimeInstance(int dStyle, int tStyle)

  public static final DateFormat getDateInstance(int dStyle, Locale l)
  public static final DateFormat getTimeInstance(int tStyle, Locale l)
  public static final DateFormat getDateTimeInstance(int dStyle, int tStyle, Locale l)

  public static final int DEFAULT, FULL, LONG, MEDIUM, SHORT

  public final String format(Date d)
  public final StringBuffer format(Object n_d, StrinBuffer to, FieldPosition f)

  public final Date parse(String s)
  public final Object parseObject(String s, ParsePosition p)

Beispiele: Verwendung von Calender und DateFormat

    static void testCalendar() {

        Screen sc = new Screen();
        KeyBoard kb = new KeyBoard();
        String s = "";

        BuchungInterface a = new BuchungCalendar(1,9,50.0);
	try {
            sc.println("press enter to continue");
            s = kb.readLine();
	}
	catch(IOException e) { }
        BuchungInterface b = new BuchungCalendar(9,2,100.0);

        sc.println("a = " + a);
        sc.println("b = " + b);

        boolean t = a.vor(b);
        sc.println("t = " + t);
        t = a.nach(b);
        sc.println("t = " + t);

        sc.println();
    }

Ausgabe

press enter to continue

a = <BuchungCalendar von='1' nach='9' betrag='50.0' zeit='Sonntag, 16. Dezember 2001 17.02 Uhr CET' />
b = <BuchungCalendar von='9' nach='2' betrag='100.0' zeit='Sonntag, 16. Dezember 2001 17.02 Uhr CET' />
t = false
t = false

Locale

java.util.Locale stellt Sprache, Land und weitere Feinheiten dar. Es existieren eine ganze Reihe von vordefinierten Locale-Objekten.

public final class Locale
extends Object
implements Cloneable, Serializable

   public Locale(String sprace, String land)
   public Locale(String sprace, String land, String feinheit)

   public static final Locale GERMANY, US, FRANCE, JAPAN, CHINA, ...
   public static final Locale GERMAN, ENGLISH, FRENCH, JAPANESE, CHINESE, ...

   public static Locale getDefault()
   public static void setDefault(Locale l)

   public final String getDisplayCountry()
   public final String getDisplayLanguage()
   public final String getDisplayName()
   public final String getDisplayVariant()
import java.util.Locale;
import java.text.DateFormat;

public class BuchungCalendarFrance extends BuchungCalendar {

    public BuchungCalendarFrance(int von, int nach, double b) {
        super(von,nach,b);
        zeitFormat = DateFormat.getDateTimeInstance(
                        DateFormat.FULL,
                        DateFormat.FULL, 
                        Locale.FRANCE);
    }
}
    static void testCalendarFrance() {

        Screen sc = new Screen();
        KeyBoard kb = new KeyBoard();
        String s = "";

        BuchungInterface a = new BuchungCalendarFrance(1,9,50.0);
        BuchungInterface b = new BuchungCalendarFrance(9,2,100.0);

        sc.println("a = " + a);
        sc.println("b = " + b);

        boolean t = a.vor(b);
        sc.println("t = " + t);

        sc.println();
    }
import java.util.Locale;
import java.text.DateFormat;

public class BuchungCalendarItaly extends BuchungCalendar {

    public BuchungCalendarItaly(int von, int nach, double b) {
        super(von,nach,b);
        zeitFormat = DateFormat.getDateTimeInstance(
                        DateFormat.FULL,
                        DateFormat.FULL, 
                        Locale.ITALY);
    }
}
import java.util.Locale;
import java.text.DateFormat;

public class BuchungCalendarJapan extends BuchungCalendar {

    public BuchungCalendarJapan(int von, int nach, double b) {
        super(von,nach,b);
        zeitFormat = DateFormat.getDateTimeInstance(
                        DateFormat.FULL,
                        DateFormat.FULL, 
                        Locale.JAPAN);
    }
}
import java.util.Locale;
import java.text.DateFormat;

public class BuchungCalendarUS extends BuchungCalendar {

    public BuchungCalendarUS(int von, int nach, double b) {
        super(von,nach,b);
        zeitFormat = DateFormat.getDateTimeInstance(
                        DateFormat.FULL,
                        DateFormat.FULL, 
                        Locale.US);
    }
}
    static void testCalendarUS() {

        Screen sc = new Screen();
        KeyBoard kb = new KeyBoard();
        String s = "";

        BuchungInterface a = new BuchungCalendarUS(1,9,50.0);
        BuchungInterface b = new BuchungCalendarUS(9,2,100.0);

        sc.println("a = " + a);
        sc.println("b = " + b);

        boolean t = a.vor(b);
        sc.println("t = " + t);

        sc.println();
    }

Ausgabe

a = <BuchungCalendarUS von='1' nach='9' betrag='50.0' zeit='Sunday, December 16, 2001 5:02:51 PM CET' />
b = <BuchungCalendarUS von='9' nach='2' betrag='100.0' zeit='Sunday, December 16, 2001 5:02:51 PM CET' />
t = false

Beispiel: Mischen von Date und Calendar

    static void testError() {

        Screen sc = new Screen();
        KeyBoard kb = new KeyBoard();
        String s = "";

        BuchungInterface a = new BuchungDate(1,9,50.0);
        BuchungInterface b = new BuchungCalendar(9,2,100.0);
        BuchungInterface c = new BuchungCalendarFrance(2,3,50.0);
        BuchungInterface d = new BuchungCalendarUS(3,5,99.0);
        BuchungInterface e = new BuchungCalendarItaly(6,2,15.0);

        sc.println("a = " + a);
        sc.println("b = " + b);
        sc.println("c = " + c);
        sc.println("d = " + d);
        sc.println("e = " + e);

        boolean t;
        t = a.vor(b);
        sc.println("a.vor(b) = " + t);
        t = a.vor(c);
        sc.println("a.vor(c) = " + t);
        t = e.vor(c);
        sc.println("e.vor(c) = " + t);
        t = d.vor(a);
        sc.println("d.vor(a) = " + t);

        sc.println();
    }

Ausgabe

a = <BuchungDate von='1' nach='1' betrag='50.0' zeit='Sun Dec 16 17:02:51 CET 2001' />
b = <BuchungCalendar von='9' nach='2' betrag='100.0' zeit='Sonntag, 16. Dezember 2001 17.02 Uhr CET' />
c = <BuchungCalendarFrance von='2' nach='3' betrag='50.0' zeit='dimanche 16 décembre 2001 17 h 02 CET' />
d = <BuchungCalendarUS von='3' nach='5' betrag='99.0' zeit='Sunday, December 16, 2001 5:02:51 PM CET' />
e = <BuchungCalendarItaly von='6' nach='2' betrag='15.0' zeit='domenica 16 dicembre 2001 17.02.51 CET' />
a.vor(b) = false
a.vor(c) = true
e.vor(c) = false
d.vor(a) = false

ResourceBundle, ListResourceBundle

java.util.ResourceBundle dient zur Verknüpfung von Locale und den entsprechenden Texten/Objekten einer Anwendung.

public abstract class ResourceBundle
extends Object

   public static final ResourceBundle getBundle(String anwendung)
   public static final ResourceBundle getBundle(String anwendung, Locale l)

   public final String getString(String key)
   public final Object getObject(String key)

java.util.ListResourceBundle

public abstract class ListResourceBundle
extends ResourceBundle

   protected abstract Object[][] getContents()

Aufbau der Resource Namen:

baseClassName_language_country_variant

BuchungResource, BuchungResource_en, BuchungResource_en_us

Beispiel: Einsatz im Buchungssatz

import java.util.ListResourceBundle;

public class BuchungResource extends ListResourceBundle {

    public Object[][] getContents() { return texte; }

    static final Object[][] texte = {
        { "von",    "von" },
        { "nach",   "nach" },
        { "betrag", "betrag" },
        { "zeit",   "zeit" }
    };
}
import java.util.ListResourceBundle;

public class BuchungResource_en extends ListResourceBundle {

    public Object[][] getContents() { return texte; }

    static final Object[][] texte = {
        { "von",    "from" },
        { "nach",   "to" },
        { "betrag", "amount" },
        { "zeit",   "time" }
    };
}
import java.util.ListResourceBundle;

public class BuchungResource_fr extends ListResourceBundle {

    public Object[][] getContents() { return texte; }

    static final Object[][] texte = {
        { "von",    "de" },
        { "nach",   "vers" },
        { "betrag", "montant" },
        { "zeit",   "temps" }
    };
}
import java.util.ListResourceBundle;

public class BuchungResource_it extends ListResourceBundle {

    public Object[][] getContents() { return texte; }

    static final Object[][] texte = {
        { "von",    "di" },
        { "nach",   "a" },
        { "betrag", "importo" },
        { "zeit",   "tempo" }
    };
}
import java.util.ResourceBundle;
import java.util.Locale;
import java.text.DateFormat;

public class BuchungCalendarResource extends BuchungCalendar {

    public BuchungCalendarResource(int von, int nach, double b) {
        super(von,nach,b);
        zeitFormat = DateFormat.getDateTimeInstance(
                        DateFormat.FULL,
                        DateFormat.FULL);
    }

    public String toString() {
        ResourceBundle b = ResourceBundle.getBundle("BuchungResource");
        String s = "<" + getClass().getName();
        s +=  " " + b.getString("von") + "='" + vonKonto + "'";
        s +=  " " + b.getString("nach") + "='" + nachKonto + "'";
	s +=  " " + b.getString("betrag") + "='" + betrag + "'";
	s +=  " " + b.getString("zeit") + "='"
                  + zeitFormat.format(zeitStempel.getTime()) + "'";
	s +=  " />";
	return s;
    }
}

Test Programm:

    static void testCalendarResource() {

        Screen sc = new Screen();
        KeyBoard kb = new KeyBoard();
        String s = "";

        BuchungInterface a = new BuchungCalendarResource(1,9,50.0);
        sc.println("a = " + a);

        Locale.setDefault( Locale.FRANCE );
        BuchungInterface b = new BuchungCalendarResource(9,2,100.0);
        sc.println("b = " + b);

        Locale.setDefault( Locale.US );
        BuchungInterface c = new BuchungCalendarResource(3,4,99.0);
        sc.println("c = " + c);

        Locale.setDefault( Locale.ITALY );
        BuchungInterface d = new BuchungCalendarResource(5,2,130.0);
        sc.println("d = " + d);

        Locale.setDefault( Locale.GERMANY );
        BuchungInterface e = new BuchungCalendarResource(4,7,60.0);
        sc.println("e = " + e);

        boolean t;
        t = a.vor(b);
        sc.println("a.vor(b) = " + t);
        t = a.vor(c);
        sc.println("a.vor(c) = " + t);
        t = e.vor(c);
        sc.println("e.vor(c) = " + t);
        t = d.vor(a);
        sc.println("d.vor(a) = " + t);

        sc.println();
    }

Ausgabe

a = <BuchungCalendarResource von='1' nach='9' betrag='50.0' zeit='Sonntag, 16. Dezember 2001 17.02 Uhr CET' />
b = <BuchungCalendarResource de='9' vers='2' montant='100.0' temps='dimanche 16 décembre 2001 17 h 02 CET' />
c = <BuchungCalendarResource from='3' to='4' amount='99.0' time='Sunday, December 16, 2001 5:02:51 PM CET' />
d = <BuchungCalendarResource di='5' a='2' importo='130.0' tempo='domenica 16 dicembre 2001 17.02.51 CET' />
e = <BuchungCalendarResource von='4' nach='7' betrag='60.0' zeit='Sonntag, 16. Dezember 2001 17.02 Uhr CET' />
a.vor(b) = false
a.vor(c) = false
e.vor(c) = false
d.vor(a) = false

Beispiel: Buchungen mit Konten und BuchungCalendarResource

import java.util.Vector;
import java.util.Iterator;

public class KontenTest {

    public static void main(String[] args) {
        testBuchung();
    }

    static void testBuchung() {
    
        Screen sc = new Screen();

        Konten konten = new Konten();
        sc.println("konten = \n" + konten);

        Vector buchListe = new Vector();

        for (int i = 0; i < 10; i++) {
            int v = (new Double(Math.random()*100.0)).intValue() % 10;
            int n = (new Double(Math.random()*100.0)).intValue() % 10;
	    if ( v != n ) {
               double d = Math.floor((new Double(Math.random()*1000.0)).doubleValue());
               BuchungInterface b = new BuchungCalendarResource(v,n,d);
               sc.println("" + b);
               buchListe.add( b );
	    }
	}

        for (Iterator i = buchListe.iterator(); i.hasNext(); ) {
            BuchungInterface b = (BuchungInterface) i.next();
            int v = b.getVonKonto();
            int n = b.getNachKonto();
            double d = b.getBetrag();
            konten.buche(v, -d);
            konten.buche(n, d);
	}

        sc.println("konten = \n" + konten);

    }
}

© Universität Mannheim, Rechenzentrum, 1998-2004.

Heinz Kredel

Last modified: Sun Jan 30 21:04:32 CET 2005