Ein bisschen Overkill, aber das sollte erweiterbar sein.
NB: Ich habe nur die Multiplikator-Suche abgedeckt.
/**
* 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));
}
}
Warum möchten Sie "milions" anzeigen, wenn Sie an erster Stelle Millionen in Integer umgewandelt haben? – sauumum
Ich habe noch nichts in Integer umgewandelt. Ich habe auf das Element auf der Seite zugegriffen und die getText() -Eigenschaft verwendet, um den Text zu erhalten. Jetzt, wenn ich es drucke, zeigt es 3,3 Millionen. Alles, was ich will, ist die Zahl (3.3) des Strings '3.3 Millions' in Integer zu konvertieren, so dass ich meine hashmap sortieren und die Top 3 Länder nach ihrer Grundgesamtheit finden kann. Mein Ziel ist es, die Ergebnisse zu protokollieren als: Beispiel, Top bevölkertes Land ist (ein Land) mit 3,3 Millionen Menschen. – Uziii
Bis hierher gekommen. Jetzt möchten Sie 3,3 Millionen auf 3,3 * 1000000 ändern und in Collection stellen, damit Sie diesen Wert sortieren können. Sobald der Wert sortiert ist, möchten Sie den Wert in einer bestimmten Reihenfolge ausgeben (aufsteigend/absteigend). Hier, was Sie "3,3 Millionen" oder "3300000" drucken möchten? – sauumum