# Hilfe bei Translator-Aufgabe



## julia1997 (29. Mai 2016)

Was mache ich falsch?


```
import java.util.HashMap;
import java.util.*;

public class Translator <T1,T2> {
   
Map<String, Integer> tl = new HashMap<String, Integer>();
   
    //put
    public void put(String string, Integer integer){
        tl.put(string, integer);
        System.out.println(tl);
        }
   
    //translate
    public Object translate (Integer integer){
        Object value = tl.get(integer);
        return value;
        }
   
    //retranslate
        public Object retranslate(HashMap hm, Object value) {
            for (Object o : hm.keySet()) {
              if (hm.get(o).equals(value)) {
                return o;
              }
            }
            return null;
          }
   
   
    //test
    public static void main(String [] args){
        Translator <String , Integer > numbers = new Translator <String , Integer >();
        numbers.put("ONE", 1);
        numbers.put("TWO", 2);
        numbers.put("THREE", 3);
        System.out.println(numbers.translate(3));
        System.out.println(numbers.retranslate(tl,"three"));
    }
   
   
}
```


----------



## mrBrown (29. Mai 2016)

Du übergibst #retranslate eine HashMap, was aber überflüssig ist, #retranslate soll ja mit der eigenen HashMap, also der der des Transistors arbeiten.

In der Main kannst du `tl` nicht benutzen, da die main static ist, `tl` aber zu einem Object gehört.


----------



## julia1997 (29. Mai 2016)

Was kann ich dann verwenden außer t1?


----------



## julia1997 (29. Mai 2016)

```
import java.util.HashMap;
import java.util.*;

public class Translator <T1,T2> {
   
Map<String, Integer> tl = new HashMap<String, Integer>();
   
    //put
    public void put(String string, Integer integer){
        tl.put(string, integer);
        System.out.println(tl);
        }
   
    //translate
    public Object translate (Integer integer){
        Object value = tl.get(integer);
        return value;
        }
   
    //retranslate
        public Object retranslate(Object value) {
            for (Object o : tl.keySet()) {
              if (tl.get(o).equals(value)) {
                return o;
              }
            }
            return null;
          }
   
   
    //test
    public static void main(String [] args){
        Translator <String , Integer > numbers = new Translator <String , Integer >();
        numbers.put("ONE", 1);
        numbers.put("TWO", 2);
        numbers.put("THREE", 3);
        System.out.println(numbers.translate(3));
        System.out.println(numbers.retranslate("three"));
    }
   
   
}
```


----------



## mrBrown (29. Mai 2016)

julia1997 hat gesagt.:


> Was kann ich dann verwenden außer t1?


Nichts, an der Stelle ist es überflüssig, etwas zu übergeben. #retranslate wird auf einem Translator aufgerufen, der schon die passende HashMap besitzt


----------



## julia1997 (29. Mai 2016)

mrBrown hat gesagt.:


> Nichts, an der Stelle ist es überflüssig, etwas zu übergeben. #retranslate wird auf einem Translator aufgerufen, der schon die passende HashMap besitzt


Was kann ich machen damit nicht 0 zurückgegeben wird


----------



## mrBrown (29. Mai 2016)

Compilert es so und funktioniert es? Falls nein, welche Fehler gibt es?


Du solltest dir noch mal Nutzung von Generics angucken, bisher ist das eine falsche Verwendung.


----------



## julia1997 (29. Mai 2016)

Ausgabe:
{ONE=1}

{ONE=1, TWO=2}

{ONE=1, TWO=2, THREE=3}

null

null


----------



## mrBrown (29. Mai 2016)

julia1997 hat gesagt.:


> Was kann ich machen damit nicht 0 zurückgegeben wird



0 wird nicht zurückgegeben, sondern null.


Beim put benutzt du eine falsche Reihenfolge - oder bei der Benutzung.
Beim put ist der String der key, beim translate versuchst du aber den Integer als key zu benutzen -> Also kann nichts passendes gefunden werden.
Beim retranslate suchst du nach dem key (es sollte aber nach Value gesucht werden), in deiner Map existiert aber "three" nicht.

Du solltest also am besten die Parameter und Funktion von translate und retranslate anpassen, und die so umschreiben, dass Groß/Kleinschreibung ignoriert wird, wenn gewünscht.

Außerdem: Guck dir Generics an.


----------



## julia1997 (29. Mai 2016)

mrBrown hat gesagt.:


> 0 wird nicht zurückgegeben, sondern null.
> 
> 
> Beim put benutzt du eine falsche Reihenfolge - oder bei der Benutzung.
> ...



retranslate funktioniert jetzt ! danke! aber was kann ich bei translate ändern?


----------



## julia1997 (29. Mai 2016)

```
import java.util.HashMap;
import java.util.*;

public class Translator <T1,T2> {
   
Map<String, Integer> tl = new HashMap<String, Integer>();
   
    //put
    public void put(String string, Integer integer){
        tl.put(string, integer);
        System.out.println(tl);
        }
   
    //translate
    public Object translate (String string){
        Object value = tl.get(string);
        return value;
        }
   
    //retranslate
        public Object retranslate(Object value) {
            for (Object o : tl.keySet()) {
              if (tl.get(o).equals(value)) {
                return o;
              }
            }
            return null;
          }
   
    //test
    public static void main(String [] args){
        Translator <String , Integer > numbers = new Translator <String , Integer >();
        numbers.put("ONE", 1);
        numbers.put("TWO", 2);
        numbers.put("THREE", 3);
        System.out.println(numbers.translate("three"));
        System.out.println(numbers.retranslate(3));
    }
   
   
}
```


----------



## mrBrown (29. Mai 2016)

Was hast du denn geändert? Je nachdem muss man translate anders anpassen...


----------



## mrBrown (29. Mai 2016)

Als key fügst du "THREE" hinauf, suchst aber nach "three".

Entweder du benutzt beim Aufruf #translate den richtigen Key, oder innerhalb der Methoden von translate (nötig wären #put und #translate) konvertierst du jeden String erst in Großbuchstaben, bevor irgendwas damit gemacht wird


----------



## julia1997 (29. Mai 2016)

Ich habe retranslate und translate ausgetauscht


----------



## julia1997 (29. Mai 2016)

```
//translate
    public Object translate(Object value) {
        for (Object o : tl.values()) {
          if (tl.get(o).equals(value)) {
            return o;
          }
        }
        return null;
      }
   
    //retranslate
        public Object retranslate(Object value) {
            for (Object o : tl.keySet()) {
              if (tl.get(o).equals(value)) {
                return o;
              }
            }
            return null;
          }
```


Gibt es kein Gegenstück zu keySet und get?


----------



## julia1997 (29. Mai 2016)

Ah jetzt funktioniers! Danke


----------



## mrBrown (29. Mai 2016)

Und wie siehts jetzt aus?

Generics werden vermutlich immer noch nicht passend benutzt


----------



## julia1997 (29. Mai 2016)

Haha, nein das muss ich noch schnell ändern  bei translate:
 return tl.get(value);


----------

