2017-05-09 52 views
0

我已經得到了一個給定的字符串替換這樣的字符串:爪哇:號碼與對應的ID

「[1],[2,4],[1,2,3],[12 ,42] ...「,它具有不可預測的結構(即可能有更多的括號或更多的數字)。

這些數字對應於包含在HashMap中的某個ID。 例如:

1-> Apollo11​​

2-> NewYork12

4-> Hello3

...

42-> Joe4

...

我該如何替換字符串中的數字與他們相應的ID,沒有歧義? 例如,如果我用數字替換數字,我可以有:

1->甚至是屬於12的1都會受到影響。

如果我從最大的數字即42開始,當替換4時,即使Joe4中的「4」也會受到影響。

感謝您的關注。

+0

我建議看看正則表達式,這將是一個或多或少簡單的解決方案。另一種方法是首先解析字符串(格式非常簡單),使用數據並將其轉換回字符串。 –

回答

0

這是我的解決方案(不打磨,但我希望你明白)。由於缺少查找值的我只是**value**替換所有值爲例:

public static void main(String[] args) { 
    String input = "[1] ,[2,4], [1,2,3] ,[12,42]..."; 
    int start = -1; 
    StringBuilder builder = new StringBuilder(); 
    for (int idx = 0; idx < input.length(); idx++) { 
     char c = input.charAt(idx); 
     if (start == -1) { 
      if (Character.isDigit(c)) { 
       start = idx; 
      } else { 
       builder.append(c); 
      } 
     } else if (!Character.isDigit(c)) { 
      builder.append(valueOf(input.substring(start, idx)) + c); 
      start = -1; 
     } 
    } 
    if (start != -1) { 
     builder.append(valueOf(input.substring(start, input.length()))); 
    } 
    System.out.println(builder); 
} 

private static String valueOf(String num) { 
    int val = Integer.parseInt(num); 
    return map.getOrDefault(val,"**" + val + "**"); 
} 

輸出:

[**1**] ,[**2**,**4**], [**1**,**2**,**3**] ,[**12**,**42**]... 

你必須與參考您的地圖,更換表達map.getOrDefault(val,"**" + val + "**")替換字符串被保留。

0

簡單地通過相關聯的名稱更換號碼的出現次數將有幾個缺點,你已經找到了:

  • 你需要幾經這可能意味着一個顯著的性能損失,如果你的字符串是大或者你有大量的對
  • 如果你想從大到小替換數字,你仍然可能遇到問題,例如,如果你只有4的映射,因此你仍然可以替換42中的4
  • 使用正則表達式可以匹配不包含字符或其他數字的數字b這可能會進一步提高性能,並且仍然有點脆弱,例如,如果您要用Apollo 11替換1,並稍後替換11

因此,最安全的方法可能是在數字處拆分字符串,遍歷令牌,替換任何數字並重新加入元素。

實施例:

Map<String, String> mapping = ...; 
String input = "[1] ,[2,4], [1,2,3] ,[12,42]"; 
String[] elements = input.split("(?<=\\d++|\\D++)"); 
StringBuilder result = new StringBuilder(); 
for(String element : elements) { 
    //simple way to get around checking whether an element is a number: 
    //if there is nothing mapped, use the element itself - this also keeps unmapped numbers 
    String replacement = mapping.get(element); 
    result.appdend(replacement != null ? replacement : element); 
} 

用於拆分對正則表達式的一些詞:

  • (?<=...)是零寬度的外觀的後面,即,它的...表達的任何匹配前的任何位置直接匹配。
  • \d++|\D++匹配任何序列的數字或非數字與積極量詞(即儘可能匹配,並不「回報」匹配)。

整個表達式與您的數字之前的位置相匹配,並且恰好位於任何不是數字(或換句話說:在數字之後)之前的位置。