简体   繁体   中英

Converting String to values in hashmap

I'm working on a program that reads in a string and then converts each character of that string into a number based on its value in the hashmap.

Just like a telephone number. What I'm having trouble with is the logic behind it, I can't seem to get it work.

What I'm doing is converting the string to a char array and then iterating over it and grabbing the first character. Then I find the key in the hashmap corresponding to the letter and get the value of it. I add this value to my empty word (this will build up the new string).

Can't seem to get it to work, been working on it for a while. Thanks for help.

Hashmap values: mapped as

public static void setUpHashmap(){
    lettersToNumbers.put("abc", '2');
    lettersToNumbers.put("def", '3');
    lettersToNumbers.put("ghi", '4');
    lettersToNumbers.put("jkl", '5');
    lettersToNumbers.put("mno", '6');
    lettersToNumbers.put("pqrs", '7');
    lettersToNumbers.put("tuv", '8');
    lettersToNumbers.put("wxyz", '9');
}

Code:

public static String convertCharStringToNumbers(String str){
    char[] stringArray = str.toCharArray();
    String word = "";
    for (int i = 0; i < stringArray.length; i++){
        char letter = stringArray[i];
        if (lettersToNumbers.containsKey(letter)){
            word+=lettersToNumbers.get(letter);
        }
    }
    System.out.println(word.toString());
    return word;

}

Your way: Iterate through the Hashmap keys(Eek)

for(String key : lettersToNumbers.keySet()) {
    if(key.contains(String.valueOf(stringArray[i])){
      //Do what you want
    }
}

Better way: O(1) lookups(The whole point of using Hashmaps?)

Put characters as key in the hashmap and do lookups.

Quick and diRty hacK))

static HashMap<String,Character> lettersToNumbers = new HashMap<String, Character>();

public static String convertCharStringToNumbers(String str){
    String[] stringArray = str.split("(?!^)");
    String word = "";
    for (String letter : stringArray) {
        for (String s : lettersToNumbers.keySet()) {
            if (s.contains(String.valueOf(letter))) {
                word += lettersToNumbers.get(s);
            }
        }
    }
    System.out.println(word.toString());
    return word;

}

public static void setUpHashmap(){
    lettersToNumbers.put("abc", '2');
    lettersToNumbers.put("def", '3');
    lettersToNumbers.put("ghi", '4');
    lettersToNumbers.put("jkl", '5');
    lettersToNumbers.put("mno", '6');
    lettersToNumbers.put("pqrs", '7');
    lettersToNumbers.put("tuv", '8');
    lettersToNumbers.put("wxyz", '9');
}

OR

static HashMap<Character, Integer> lettersToNumbers = new HashMap<Character, Integer>();

public static String convertCharStringToNumbers(String str){
    char[] stringArray = str.toCharArray();
    String word = "";
    for (char letter : stringArray) {
        if (lettersToNumbers.containsKey(letter)) {
            word += lettersToNumbers.get(letter);
        }
    }
    System.out.println(word.toString());
    return word;

}

public static void setUpHashMap(){
    for (int i=97, t = 2; i<121; i+=3, t++){
        lettersToNumbers.put((char)i, t);
        lettersToNumbers.put((char)(i+1), t);
        lettersToNumbers.put((char)(i+2), t);
    }
    lettersToNumbers.put((char)(122), 9);
}

if abc == 1, then t = 1 or if abc == 2 (how in my telephone) then t = 2.

Assuming you are entering a string in your program say "xyzuuabc" then the program prints out the corresponding mapped numbers "47855213".

String name = "";

    Map<Character, String> lettersToNumbers = new HashMap<Character, String>();
    lettersToNumbers.put('a', "2");
    lettersToNumbers.put('x', "4");
    lettersToNumbers.put('u', "5");
    lettersToNumbers.put('b', "1");
    lettersToNumbers.put('c', "3");
    lettersToNumbers.put('y', "7");
    lettersToNumbers.put('z', "8");

    String enteredString = "xyzuuabc";
    char[] splitNum = enteredString.toCharArray();

    for (int i = 0; i < splitNum.length; i++) {
        if (lettersToNumbers.containsKey(splitNum[i])) {
            name += lettersToNumbers.get(splitNum[i]);
        }
    }
    System.out.println(name);
}

Your set contains entries like ("abc",2), yet everytime you call the function convertCharStringToNumber, you are checking if the map contains one character at a time, so if the string sent in is "atq", you are checking for the keys a, t, and q. Yet, none of these keys exist in the map that you have created. If instead that map looked like:

  lettersToNumbers.put("a",2);
  lettersToNumbers.put("b",2");
  lettersToNumbers.put("c",2";
  //continue for the rest of the alphabet

Then the keys would actually be contained in the map.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM