Java查找字符串並替換爲字典中的value值

問題:

根據字典對字符串中的字母進行替換 ,並打印出所有的可能,使用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;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章