問題:
根據字典對字符串中的字母進行替換 ,並打印出所有的可能,使用Python會更容易些,直接調用字典就可以了。這裏使用Java,並通過Json解析字典。
比如說:字典數據爲:{‘x’: [‘A’, ‘B’], ‘y’: [‘Y’]},其中 ‘x’ 能夠被 ‘A’ 或 'B’替換,‘y’ 能被 'Y’替換。對字符串“xabcy”進行處理,替換的所有結果爲:AabcY、BabcY
代碼
TestData.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
/**
* 該算法採用的是遞歸的方式,數據存儲到List中,不過也可以使用循環的方式,把數據存儲到數組中,或者把List和數組結合起來使用
*/
public class TestData {
private static String dict;// 存儲字典數據,測試用的,可以通過流的方式讀取文件中的字典數據
private static List<List<String>> handleLists;// 存儲待處理的數據
private static List<String> list;// 存儲每個字符對應的字典數據
private static Scanner in;// 輸入數據
private static String str;// 鍵入的字符串
private static String ch;// 保存字符對應的字符串
private static JSONArray arr;// 獲取每個字符對應的字典數據
@SuppressWarnings("deprecation")
public static void main(String[] args) {
dict = "{'a': ['B', 'C', 'M'], 'b': ['X','Y']}";
handleLists = new ArrayList<List<String>>();
in = new Scanner(System.in);
try {
// Json解析數據
JSONObject json = new JSONObject(dict);
// 循環鍵入數據及處理
while (true) {
handleLists.clear();
System.out.println("輸入字符串!");
str = in.next();
for (int i = 0; i < str.length(); i++) {
list = new ArrayList<String>();
ch = String.valueOf(str.charAt(i));
if (json.has(ch)) {
arr = json.getJSONArray(ch);
for (int j = 0; j < arr.length(); j++) {
list.add(arr.getString(j));
}
} else {
list.add(String.valueOf(ch));
}
handleLists.add(list);
}
handleLists = Utils.recursitve(handleLists, new ArrayList<List<String>>(), 0, new ArrayList<String>());// 遍歷所有的結果
System.out.println("共 " + handleLists.size() + " 個結果");
for (List<String> li : handleLists) {
for (String s : li) {
System.out.print(s);
}
System.out.println();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
遍歷數據工具包
Utils.java
import java.util.ArrayList;
import java.util.List;
public class Utils {
/**
* 遞歸實現對originalLists中所有層數據的遍歷,結果放在resultLists中
*
* @param originalLists
* 原始數據
* @param resultLists
* 結果數據
* @param layer
* originalLists的層數
* @param result
* 每次遍歷的結果
*/
public static List<List<String>> recursitve(List<List<String>> originalLists, List<List<String>> resultLists,
int layer, List<String> result) {
if (layer < originalLists.size() - 1) {
if (originalLists.get(layer).size() == 0) {
recursitve(originalLists, resultLists, layer + 1, result);
} else {
for (int i = 0; i < originalLists.get(layer).size(); i++) {
List<String> list = new ArrayList<String>(result);
list.add(originalLists.get(layer).get(i));
recursitve(originalLists, resultLists, layer + 1, list);
}
}
} else if (layer == originalLists.size() - 1) {
if (originalLists.get(layer).size() == 0) {
resultLists.add(result);
} else {
for (int i = 0; i < originalLists.get(layer).size(); i++) {
List<String> list = new ArrayList<String>(result);
list.add(originalLists.get(layer).get(i));
resultLists.add(list);
}
}
}
return resultLists;
}
}