Sto provando a tradurre i nodi su un albero di nuovo formato e ho problemi a ottenere la sostituzione corretta. Dire che ho il HashMap
:Sostituzioni multiple Java su un singolo passaggio
"(1:" : "(30:"
",1:" : ",30:"
"(30:" : "(6:"
",30:" : ",6:"
E l'albero:
(30:0.07,(1:0.06,2:0.76))
La saggezza convenzionale potrebbe suggerire multipla replaceAll
, ma questo pone un problema:
replaceAll("(1:", "(30:") >> (30:0.07,(30:0.06,2:0.76))
replaceAll("(30:", "(6:") >> (6:0.07,(6:0.06,2:0.76))
Il problema qui è che abbiamo' ha sostituito un nodo che è stato precedentemente sostituito. L'albero corretta dovrebbe essere simile:
(6:0.07,(30:0.06,2:0.76))
Ora ho già fatto questo in Python:
def multiple_replace(taxa, text):
regex = re.compile("|".join(map(re.escape, taxa.keys())))
return regex.sub(lambda mo: taxa[mo.group(0)], text)
ma sto avendo problemi con la mia implementazione Java:
private String convertTree (String treeOld, HashMap<String, String> conv) {
Pattern pattern = Pattern.compile("\\(\\d+:|,\\d+:");
Matcher matcher = pattern.matcher(treeOld);
StringBuilder sbt = new StringBuilder(treeOld);
while (matcher.find()) {
String replace = conv.get(matcher.group());
System.out.println(matcher.group() + "||" +replace + " || " + matcher.start() + ":"+matcher.end());
sbt.delete(matcher.start(), matcher.end());
sbt.insert(matcher.start(), replace);
}
return treeOld;
}
Mentre la sostituzione sembra funzionare, non riesco a ottenere l'indicizzazione abbastanza corretta con diverse dimensioni di stringhe (come mostrato nell'esempio). C'è un modo per farlo in Java?
Molto più pulito del mio tentativo, grazie mille! – Darkstarone