Double Werte aus String filtern in Java?

4 Antworten

Da du von einem Scanner schreibst, gehe ich davon aus, dass du nicht mit JavaScript, sondern mit Java arbeitest.

Dein Response entspricht wohl dem JSON-Format.

{
  "AED": 4.201811,
  "AFN": 109.023911,
  "ALL": 121.358177,
  /* ... */
}

Das heißt, man könnte zum Lesen eine Bibliothek wie gson einsetzen.

Mit einem Scanner-Objekt kannst du den String aber ebenso parsen. Unter der Annahme, dass keiner der Keys eine Zahl oder einen Punkt enthält, wäre dies eine Lösung:

String responseText = // ...
Scanner reader = new Scanner(responseText);
reader.useDelimiter("[^0-9.]+");

while (reader.hasNextDouble()) {
  System.out.println(reader.nextDouble());
}

Es werden einfach alle nichtnumerischen Zeichen (sowie der Punkt) als Trennzeichen verwendet.

Noch eine andere Option wäre es, den String anhand von Trennzeichen zu zerlegen. Konkret wären das der Doppelpunkt und das Komma.

String[] entries = responseText.split("[,:]");

Über das Ergebnisarray müsste man nachfolgend iterieren und je Eintrag prüfen, ob er sich zu einem Dezimalwert parsen lässt.

try {
  double number = Double.parseDouble(entry);
  // ...
}
catch (NumberFormatException ex) {
}
Schneefresser 
Fragesteller
 07.02.2022, 13:09

Oh ja stimmt java und nicht JavaScript. Die ausgabe ist nur mit einem split so. Ich kann aber mal ein bisschen mit deinen Lösungsansätzen rumprobieren aber das ist fürs erste sehr hilfreich.

0
Schneefresser 
Fragesteller
 07.02.2022, 13:19

Der split hat mir extrem geholfen. Ich habe vorher alles versucht , und : gleichzeitig als split zu nutzen.

0
regex9  07.02.2022, 13:26
@Schneefresser

Zur Erklärung: Der an split übergebene String entspricht (einmal wieder) einem regulären Ausdruck. Im oberen Fall wird also eine Zeichengruppe definiert, jedes Zeichen darin wird als Trenner gewertet.

0

Arbeite doch mit RegEx und mach ein Match auf alle Werte, die du haben willst. Die Matches wären dann in einem Array zurückgegeben

wenn wir wenigstens eine vorlage hätten

könnte man mit einem RegEx machen der dann die werte in ein Array packt . oder oder oder .

Schneefresser 
Fragesteller
 07.02.2022, 10:57

Der String den ich bekomme sieht so aus: „“rates“:{„AED“:4.201811,“AFN“:109.023911,“ALL“:121.358177,.........“ und in dem Stil noch rund 100 weitere

0
Schneefresser 
Fragesteller
 07.02.2022, 11:13
@TechPech1984

setzt es dann voraus dass sich die eingabe nicht verändern darf? Die eingabe ändert sich nämlich bei jedem start

0
TechPech1984  07.02.2022, 11:15
@Schneefresser

lol , probier das doch einfach mal aus . es findet

zahlen.zahlen

nach dem muster .

hab dir sogar die doku verlinkt , also lernen musste schon selber .

0
Schneefresser 
Fragesteller
 07.02.2022, 11:48
@TechPech1984

Da muss ich mich wohl nochmal schlau lesen. Bevor ich das mache... gibt es eine Möglichkeit 2 strings miteinander zu vergleichen und alle Differenzen auszusortieren und alles was identisch ist stehen zu lassen? Dies wär glaub ich die eleganteste lösung via splits wenn das möglich ist.

0
TechPech1984  07.02.2022, 11:51
@Schneefresser

das vereinfacht es nicht wirklich , den in jedem fall musst du dein zeug irgendwie in arrays stopfen .

0
Schneefresser 
Fragesteller
 07.02.2022, 11:56
@TechPech1984

das wird meinen lehrer vermutlich nicht stören. Habe die normalen aufgaben zu schnell erledigt dass ich als einziger diese aufgabe ohne erklärung bekommen habe. Da sind ein paar arrays eine üblichere variante bei meinem wissen

0
TechPech1984  07.02.2022, 12:01
@Schneefresser

also dann tu einfach :) texte verlgeichen bringt jedenfalls nix . den das ist aufwand der eher zu problemen führt . das ist ein computer programm und nicht ein gehirn .

ergo , du machst ein array aus deiner CSV oder JSON string und dann noch ein Array und vegleichst . Deine Aufgabenstellung die du hier aber gefragt hast ist und bleibt , doubles filtern . Alles andere ist eine andere Frage . Da solltest Du aber erstmal Code liefern . viel spass .

mit regex kannst du auch noch mehr anfragen , also mal lernen

z.b. könntest du auch die Kürzel gleich mit abfragen und in ein 2 dimensionales array alles packen , also tabelle . dann weisste auch welche werte sich wo ändern , ggf 3 dimensionen nehmen .

0
Schneefresser 
Fragesteller
 07.02.2022, 12:12
@TechPech1984

Bisher habe ich splits bei : und bei , gesetzt... somit habe ich 2 arrays in denen die selben zahlen stehen aber der Rest ist unterschiedlich. Könnte ich also alles ungleiche rausfiltern hätte ich eine array nur mit den zahlen, welche ich dann in einen double umformen kann. Der rest wäre dann einfacher.

0