tutorials.de Buch-Aktion 05/2012
Seite 3 von 6 ErsteErste 123456 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
85
ZUGRIFFE
23447
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #31
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Was ist die Ausgabe des Beispielcodes unter:
    http://www.tutorials.de/forum/1630760-post5.html
    und warum?
    Achtung Spoiler:

    Einträge in einem Set müssen immutable sein, sonst können Duplikate entstehen. Offensichtlich ist das bei der konkreten Map.Entry Klasse nicht der Fall. Die IdentityHashMap scheint immer das selbe interne Objekt zu recyceln. So zeigen alle Referenzen auf das selbe Objekt. Würde man die HashMap in einer Schleife sequenziell befüllen, müsste man das sehen können. Warum die Add-Methode die Duplikate nicht erkennt ist mir jedoch noch ein Rätsel. Ich bleibe dran.

    Ich weiss, dass die Erklärung noch etwas wage ist. Bin ich auf dem richtigen Weg?

    Fr34k9 bedankt sich. 
    I didn't write this; a very complex macro did.

  2. #32
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    @limago: Ja bist du.
     

  3. #33
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Achtung Spoiler:

    Ich glaube ich habe habe es. Die Add-Methode ermittelt den HashCode des zu speichernden Objektes. Dieser wird als Key für die Referenz benutzt. Der nächste Aufruf von Add ermittelt einen anderen Hashcode aus den Objektdaten, also wird die Referenz mit dem anderen Hashcode in das Set eingetragen. Beide Refenzen zeigen nun aber auf das one and only Objekt. Das ist es oder?
     
    I didn't write this; a very complex macro did.

  4. #34
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    @tom: Nicht nur den Code lesen, sondern auch was drunter steht. Dann wird die Frage klarer
     
    I didn't write this; a very complex macro did.

  5. #35
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Zitat Zitat von zeja Beitrag anzeigen
    Achtung Spoiler:

    @Kai008
    "aber soweit ich weiß kommt bei einer static jedes mal der selbe Returnwert oder so, was auch immer das für einen Sinn haben mag."
    Wo hast du dass denn aufgeschnappt? static an einer Methode bedeutet nur dass es nicht abhängig von einer Instanz der Klasse ist sondern direkt mit Klasse.methode aufgerufen werden kann. Kann man für Methoden nutzen die auf keinen Zustand angewiesen sind.
    Achtung Spoiler:

    Ach sooooooo, danke. Jetzt verstehe ich auch warum die Main static ist: Weil keine Instanz eines Überobjekt's intialisiert ist was sie aufrufen könnte kann sie nur aufgerufen werden wenn sie unabhängig eines anderen Objekts ist.
    Die Frage kommt aus der Zeit als ich mich mit OOP auseinandergesetzt habe. Damals hat die Main noch alles erledigt (anderst als jetzt wo nur ein "new" drinnensteht), und ich habe der Klasse "Soldat" ein Static verpasst weil es in der Paint dadurch verlangt wurde, und ein Bekannter hat "wenn die variablen static sind, dann sind se für alle soldaten gleich
    " als ich ihm nach einen Fehler gefragt habe geschrieben.
    Deshalb bin ich davon ausgegangen dass ein return() auch immer den selben Wert zurückliefert.
     

  6. #36
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Ich habe eine Abstrakte Klasse, von dieser erben 2 Kindklassen. Beide haben identische codierte Methoden. Könnte diese nicht besser in der in der abstrakten Klasse implementiert werden. kann es Gründe für folgende Lösung geben?

    Code java:
    1
    2
    3
    4
    5
    6
    7
    
    package de.tutorials;
     
    public abstract class AbstractParent {
        
        public abstract void doSomeThingWithWorker(Worker worker);
     
    }

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    package de.tutorials;
     
    public class ConcreteChild1 extends AbstractParent {
     
        @Override
        public void doSomeThingWithWorker(Worker worker) {
            
            worker.work(this);
        }
     
    }

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    package de.tutorials;
     
    public class ConcreteChild2 extends AbstractParent {
     
        @Override
        public void doSomeThingWithWorker(Worker worker) {
            
            worker.work(this);
        }
     
    }

    Sieht doch ziemlich redundant aus. Oder ist es das nicht?
     
    I didn't write this; a very complex macro did.

  7. #37
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Achtung Spoiler:

    Da "this" zur Funktion "work" mitgeliefert wird, kann die Klasse "Worker" auf beide erbenden Klassen individuell "eingehen", falls du das gemeint hast. Denke zwar eher nicht weil das wohl zu einfach ging, aber will mal mein Glück versuchen. =)
     

  8. #38
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    @kai008

    Du hast im Prinzip recht. Aber warum kann ich die Methode nicht in der abstrakten Klasse implementieren? Diese ist selbst ja nicht instanziierbar. Also würde der this-Zeiger der abstrakten Klasse ja sowieso immer auf eine der Childinstanz zeigen.

    Schlimmstenfalls passiert dies :

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    package de.tutorials;
     
    public class Main {
        
        public static void main(String[] args) {
            
            AbstractParent referenz = new ConcreteChild1();
            
            referenz.doSomeThingWithWorker(new Worker());
        }
     
    }


    Könnte ich da nicht einfacher und besser auf die "doSomeThingWithWorker"-Methode verzichten und gleich folgenden Aufruf ausführen?

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    package de.tutorials;
     
    public class Main {
        
        public static void main(String[] args) {
            
            AbstractParent referenz = new ConcreteChild1();
            
            new Worker().work(referenz);
        }
     
    }
    Geändert von limago (13.07.08 um 09:33 Uhr)
     
    I didn't write this; a very complex macro did.

  9. #39
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    was ist die Ausgabe hiervon und warum:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    /**
     * 
     */
    package de.tutorials;
    /**
     * @author Tom
     */
    public class Main {
        public static void main(String[] args) {
            System.out.println("null".equals(String.valueOf((Object)null)));
            System.out.println("null".equals(String.valueOf(null)));
        }
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  10. #40
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    die Ausgabe:
    Code java:
    1
    2
    3
    4
    5
    
    true
    Exception in thread "main" java.lang.NullPointerException
        at java.lang.String.<init>(Unknown Source)
        at java.lang.String.valueOf(Unknown Source)
        at de.tutorials.NullStringEqualsNull.main(NullStringEqualsNull.java:17)

    Erklärung:
    Beim ersten Aufruf wird die Überladung mit String(Object value) Signatur der valueOf Methode aufgerufen.
    Code java:
    1
    2
    3
    
    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
        }

    Beim zweiten Aufruf wird jedoch auf die String (char[] data) Variante gegangen. Da hier davon ausgegegan wird, dass das char[] nicht null ist, kommt hier im weiteren Verlauf eine NullPointerException zu stande.
    Code java:
    1
    2
    3
    
        public static String valueOf(char data[]) {
        return new String(data);
        }

    Tja, nur warum wird hier beim zweiten Aufruf die String (char[] data)? Weil diese nach Java Language Spec die am besten passende Varainte für die Eingabe ist. Warum? - Das Wird durch eine ganze Menge von ziemlich komplizierten Regeln in der JLS beschrieben, wie ihr hier nachlesen könnt:

    15.12 Method Invocation Expressions
    http://java.sun.com/docs/books/jls/t...ns.html#292575

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  11. #41
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    hier mal noch ein neues Rätsel:

    Eine Zahl soll in ein Zahlenwort umgewandelt werden. Beispiel 2147483647 in "zwei Milliarden hundertsiebenundvierzig Millionen vierhundertdreiundachtzigtausendsechshundertsiebenundvierzig".
    Wie macht man das möglichst schnell, einfach und elegant?
    (Man darf auch zusatzlibs verwenden, aus dem Eclipse Project, Tomcat, Spring, Hibernate, etc.)

    Keiner Hint als zusäzliche Anforderung: Man soll die Zahl auch auf "englisch" und "französisch" ausgeben können also bei 2147483647 :
    englisch: two billion, one hundred and forty-seven million, four hundred and eighty-three thousand, six hundred and forty-seven
    französisch: deux milliard cent quarante-sept million quatre cents quatre-vingt-trois mille six cents quarante-sept

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  12. #42
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Ich habs mal versucht, weiß aber nicht ob es gut funktioniert, oder noch mehr ob es sauber ist, habe es schnell runtergeschrieben, und nur ein mal am Ende ausprobiert.

    Ach ja, habe es fürs erste nur bis Tausend gemacht, sollte aber einfach so erweiterbar sein.
    Angehängte Dateien Angehängte Dateien
    Geändert von Kai008 (25.07.08 um 19:54 Uhr)
     

  13. #43
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    danke Kai008 das du dich daran versucht hast Dein Ansatz funktioniert natürlich auch, jedoch muss man hier noch relativ viel "selber machen". Wie wärs denn damit?
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.util.Locale;
     
    import com.ibm.icu.text.RuleBasedNumberFormat;
     
    /**
     * @author Tom
     * 
     */
    public class NumberSpelling {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            int number = Integer.MAX_VALUE;
            System.out.println(number);
            System.out.println(new RuleBasedNumberFormat(Locale.GERMANY,
                    RuleBasedNumberFormat.SPELLOUT).format(number));
            System.out.println(new RuleBasedNumberFormat(Locale.US,
                    RuleBasedNumberFormat.SPELLOUT).format(number));
            System.out.println(new RuleBasedNumberFormat(Locale.FRANCE,
                    RuleBasedNumberFormat.SPELLOUT).format(number));
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    
    2147483647
    zwei Milliarden hundertsiebenundvierzig Millionen vierhundertdreiundachtzigtausendsechshundertsiebenundvierzig
    two billion, one hundred and forty-seven million, four hundred and eighty-three thousand, six hundred and forty-seven
    deux milliard cent quarante-sept million quatre cents quatre-vingt-trois mille six cents quarante-sept

    Kommt mir bekannt vor? Das kann sein, denn:
    http://www.tutorials.de/forum/java/2...ahlenwort.html

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  14. #44
    thomy800 thomy800 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    245
    Letztendlich macht die RuleBasedNumberFormat-Version aber auch nicht viel anders als Kai008s Version, nur dass Kai008 die Funktionen selber geschrieben hat
     
    Hier kommt der Genuss!

  15. #45
    java123 java123 ist offline Mitglied Bronze
    Registriert seit
    Jun 2009
    Beiträge
    37
    *Thread ausgrab*

    Was wird ausgegeben wenn man folgendes Programm ausführt? Es dürfte zwar relativ klar sein, aber die Idee kam mir gerade heute und wunderte mich ob auch wirklich das "Gedachte" auf der Konsole ausgegeben wird.
    Achja, das Warum könnt ihr auch noch angeben.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    public class Foo implements ActionListener {
        public Foo() {
            new Foobar().a(this);
        }
        public static void main(String[] args) {
            new Foo();
        }
        public void actionPerformed(ActionEvent e) {}
    }
     
    class Foobar {
        public void a(ActionListener a) {
            System.out.println("actionlistener");
        }
        public void a(Foo foo) {
            System.out.println("foo");
        }
    }
    Geändert von java123 (27.08.09 um 22:57 Uhr)
     

Ähnliche Themen

  1. Rätsel
    Von Layna im Forum Smalltalk
    Antworten: 5
    Letzter Beitrag: 18.11.04, 19:11
  2. Rätsel
    Von Olli-Web im Forum Fun-Forum
    Antworten: 6
    Letzter Beitrag: 01.05.04, 14:27
  3. Rätsel
    Von reBourne im Forum Smalltalk
    Antworten: 6
    Letzter Beitrag: 30.09.03, 13:23
  4. 3 Rätsel
    Von mslap im Forum Fun-Forum
    Antworten: 5
    Letzter Beitrag: 07.08.03, 11:35
  5. Ist mir ein Rätsel
    Von Eric25 im Forum HTML-Editoren
    Antworten: 3
    Letzter Beitrag: 25.04.02, 09:03