Uziii
Uziii

Reputation: 841

Converting alpha numeric string to integer?

I have a hashMap that contains key and value as 'String'. I am getting these values from a web page in my selenium automation script.

my hashmap has following

<Italy, 3.3 millions>
<Venezuela, 30.69 millions>
<Japan, 127.1 millions>

How can I convert all the string alphanumeric values to integers so that I can apply sorting on the hashmap?

I have to display the word 'millions'.

Upvotes: 0

Views: 723

Answers (4)

OldCurmudgeon
OldCurmudgeon

Reputation: 65813

A bit overkill but this should be extensible.

NB: I've only covered the multiplier lookup.

/**
 * Possible units and their multipliers.
 */
enum Unit {
    Unit(1),
    Hundred(100),
    Thousand(1000),
    Million(1000000),
    Billion(1000000000),
    Squillion(Integer.MAX_VALUE);

    private final int multiplier;

    Unit(int multiplier) {
        this.multiplier = multiplier;
    }
}

/**
 * Comparator that matches caseless and plurals
 *
 * NB: Not certain if this is consistent.
 */
private static final Comparator<String> COMPARECASELESSANDPLURALS
        = (String o1, String o2) -> {
            // Allow case difference AND plurals.
            o1 = o1.toLowerCase();
            o2 = o2.toLowerCase();
            int diff = o1.compareTo(o2);
            if (diff != 0) {
                // One character different in length?
                if (Math.abs(o1.length() - o2.length()) == 1) {
                    // Which may be plural?
                    if (o1.length() > o2.length()) {
                        // o1 might be plural.
                        if (o1.endsWith("s")) {
                            diff = o1.substring(0, o1.length() - 1).compareTo(o2);
                        }
                    } else if (o2.endsWith("s")) {
                        // o2 might be plural.
                        diff = -o2.substring(0, o2.length() - 1).compareTo(o1);
                    }
                }
            }
            return diff;
        };

// Build my lookup.
static final Map<String, Integer> MULTIPLIERS
        = Arrays.stream(Unit.values())
        // Collect into a Map
        .collect(Collectors.toMap(
                // From name of the enum.
                u -> u.name(),
                // To its multiplier.
                u -> u.multiplier,
                // Runtime exception in case of duplicates.
                (k, v) -> {
                    throw new RuntimeException(String.format("Duplicate key %s", k));
                },
                // Use a TreeMap that ignores case and plural.
                () -> new TreeMap(COMPARECASELESSANDPLURALS)));

// Gives the multiplier for a word.
public Optional<Integer> getMultiplier(String word) {
    return Optional.ofNullable(MULTIPLIERS.get(word));
}

public void test() {
    String[] tests = {"Million", "Millions", "Thousand", "Aardvark", "billion", "billions", "squillion"};
    for (String s : tests) {
        System.out.println("multiplier(" + s + ") = " + getMultiplier(s).orElse(1));
    }
}

Upvotes: 0

Eritrean
Eritrean

Reputation: 16498

not sure if this is what you are looking for.. If i get it right you have to change your map from

<String, String> to <String, Double>.

See my example below :

import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;

public class NewClass9 {

public static void main(String[] args) throws ParseException{     
  Map<String,String> oldMap = new HashMap<>();
  oldMap.put("Italy", "3.3 millions");
  oldMap.put("Venezuela", "30.69 millions");
  oldMap.put("Japan", "127.1 millions");
  Map<String,Double> newMap = new HashMap<>();
  for(String key : oldMap.keySet()){
      newMap.put(key, convert(oldMap.get(key)));
  }

  for(String key : newMap.keySet()){
      System.out.printf("%.0f millions\n" ,newMap.get(key));
  }
}

private static double convert(String str) {       
   String[] splitted = str.split(" ");
   return Double.valueOf(splitted[0])*1000000;
}   
}

Upvotes: 0

Nicolas Filotto
Nicolas Filotto

Reputation: 44965

As far as I understand from your question what you need to do is to be able to sort those values, so what you need is a Comparator.

Here is the Comparator that could do the trick:

Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(final String value1, final String value2) {
        return Double.compare(
            Double.parseDouble(value1.substring(0, value1.length() - 9)),
            Double.parseDouble(value2.substring(0, value2.length() - 9))
        );
    }
};
System.out.println(comparator.compare("3.3 millions", "30.69 millions"));
System.out.println(comparator.compare("30.69 millions", "30.69 millions"));
System.out.println(comparator.compare("127.1 millions", "30.69 millions"));

Output:

-1
0
1

Upvotes: 1

Eritrean
Eritrean

Reputation: 16498

If you have only millions you can try something like this

  String str = "3.3 Millions"; 
  String[] splitted = str.split(" ");
  double i = Double.valueOf(splitted[0])*1000000;
  System.out.println(i);

or do your calculation depending on the substring

Upvotes: 0

Related Questions