2016-05-19 21 views
0

私はkeyとvalueを 'String'として含むhashMapを持っています。私はセレンの自動化スクリプトのWebページからこれらの値を取得しています。英数字の文字列を整数に変換していますか?

私のハッシュマップは、私はハッシュマップのソートに適用することができるよう

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

がどのように私は整数にすべての文字列英数字の値を変換することができ、次のあり?

「百万」という単語を表示する必要があります。あなただけの何百万を持っている場合は

+0

何百万もの整数を整数に変換したときに、なぜ「ミリオン」を表示したいのですか? – sauumum

+0

私は何もまだ整数に変換していません。私はページ上の要素にアクセスし、そのテキストを取得するためにgetText()プロパティを使用しました。今私がそれを印刷すると、それは3.3百万を表示します。 私が望むのは、文字列 '3.3 Millions'の数(3.3)を整数に変換して、ハッシュマップをソートして、その人口あたりの上位3つの国を見つけることです。 私の目標は、結果を次のように記録することです。 例、上位の人口は3.3億人の(ある国)です。 – Uziii

+0

ここまで来ました。今度は3.3百万を3.3 * 1000000に変更してCollectionに入れて、この値をソートできるようにします。値がソートされると、値を何らかの順序(昇順/降順)で印刷します。ここでは、 "3.3百万"または "3300000"を印刷しますか? – sauumum

答えて

0

あなたはこの

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

ような何かをしようとか、私の知る限り理解とご質問から、あなたが何をする必要があるか

+0

私は 'Millions'という単語を表示する必要があります – Uziii

1

がためにある部分文字列に応じて、あなたの計算を行うことができますこれらの値を並べ替えることができるので、必要なのはComparatorです。ここで

は、トリックを行うことができComparatorです:

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")); 

出力:

-1 
0 
1 
+0

doubleを比較してintにキャストする代わりに、Double.compareメソッドを使用することをお勧めします。 – user902383

+0

@ user902383 nice one thx –

+0

@ user902383 –

0

ない、これはあなたが探しているものであるかどうかわから..私は右のあなたにそれを取得した場合地図を

から
<String, String> to <String, Double>. 

から変更する必要があります下記の例:

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; 
} 
} 
0

ビットオーバーキルですが、これは拡張可能である必要があります。

注意:私は乗数ルックアップのみをカバーしました。

/** 
* 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)); 
    } 
} 
関連する問題