我在您的解决方案中进行了一些更改以获得所需结果.
我会在List中执行差异检查,因此我将创建基于您的代码将JSON更改为字符串列表的方法:
private static List jsonToList(String json){
List list = new ArrayList<>();
Gson gson = new Gson();
Type type = new TypeToken>(){}.getType();
Map jsonMap = gson.fromJson(json, type);
Map flatten = FlatMapUtil.flatten(jsonMap);
flatten.forEach((k, v) -> list.add(v.toString()));
return list;
}
更新
当我回答问题时,我做的事情有点快,jsonToList基于你的代码.就像现在一样,你要求的东西过于复杂.因此我使用以下方法制作了更轻的版本:
private static List jsonToList(String json) {
JSONObject response = new JSONObject(json);
List list = new ArrayList<>();
JSONArray jsonArray = response.getJSONArray("categories");
if (jsonArray != null) {
for (int i = 0; i < jsonArray.length(); i++) {
list.add(jsonArray.get(i).toString());
}
}
return list;
}
也就是说,现在您有两个选择,由您决定哪个最适合您的需求并从此处获取.
更新结束
在这个例子中,我做了3个测试例子
String main = "{\"categories\":[\"May\",\"Apr\",\"Mar\"]}";
String json1 = "{\"categories\":[\"May\",\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\"]}";
String json2 = "{\"categories\":[\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\",\"Mar\"]}";
String json3 = "{\"categories\":[\"May\",\"Apr\",\"Mar\",\"Mar\"]}";
在我的第二步,我将创建一个
List mainList = jsonToList(main);
List list1 = jsonToList(json1);
到现在为止还挺好.现在我创建一个方法来获取2列表的额外差异,这意味着您在评论中请求的,我们只采用多次重复的值并将其返回列表中.在这个方法中,我使用hashmap只计算重复数,而不是重复超过1次的所有重复:
private static List diffList(List mainList, List secondList){
List list = new ArrayList();
Map wordCount = new HashMap<>();
for(String word: secondList) {
if(mainList.contains(word)) {
Integer count = wordCount.get(word);
wordCount.put(word, (count == null) ? 1 : count + 1);
if(wordCount.get(word) > 1){
list.add(word);
}
}
}
return list;
}
最后我会测试所有情况,例如list1:
List diff1 = diffList(mainList, list1);
for (String s : diff1) {
System.out.println(s);
}
输出将是
May
Apr
Mar
对于list2
Apr
Mar
Mar
对于list3
Mar
现在我将视图方法与您的方法分开并创建一些类似的东西,只是为了让我的代码更清晰,更易于使用:
private static String viewResult(List list1, List list2, List duplicate){
String result;
StringBuilder SB = new StringBuilder("");
SB.append("Entries only on LEFT: ");
list1.forEach(e -> SB.append(e + ""));
SB.append("Entries only on RIGHT: ");
list2.forEach(e -> SB.append(e + ""));
SB.append("Entries full difference : ");
duplicate.forEach(e -> SB.append(e + ""));
result = SB.toString();
return result;
}
因此,如果我们将所有这些代码放在一起,我将会是这样的,下面的代码将演示如何工作,但是从这里开始,您可以将它带到代码的下一个级别:
public static void main(String[] args) {
String main = "{\"categories\":[\"May\",\"Apr\",\"Mar\"]}";
String json1 = "{\"categories\":[\"May\",\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\"]}";
String json2 = "{\"categories\":[\"May\",\"Apr\",\"Apr\",\"Mar\",\"Mar\",\"Mar\"]}";
String json3 = "{\"categories\":[\"May\",\"Apr\",\"Mar\",\"Mar\"]}";
List mainList = jsonToList(main);
List list1 = jsonToList(json1);
List diff1 = diffList(mainList, list1);
for (String s : diff1) {
System.out.println(s);
}
String view = viewResult(mainList, list1, diff1);
}
private static List jsonToList(String json){
List list = new ArrayList();
Gson gson = new Gson();
Type type = new TypeToken>(){}.getType();
Map jsonMap = gson.fromJson(json, type);
Map flatten = FlatMapUtil.flatten(jsonMap);
flatten.forEach((k, v) -> list.add(v.toString()));
return list;
}
private static List diffList(List mainList, List secondList){
List list = new ArrayList();
Map wordCount = new HashMap<>();
for(String word: secondList) {
if(mainList.contains(word)) {
Integer count = wordCount.get(word);
wordCount.put(word, (count == null) ? 1 : count + 1);
if(wordCount.get(word) > 1){
list.add(word);
}
}
}
return list;
}
private static String viewResult(List list1, List list2, List duplicate){
String result;
StringBuilder SB = new StringBuilder("");
SB.append("Entries only on LEFT: ");
list1.forEach(e -> SB.append(e + ""));
SB.append("Entries only on RIGHT: ");
list2.forEach(e -> SB.append(e + ""));
SB.append("Entries full difference : ");
duplicate.forEach(e -> SB.append(e + ""));
result = SB.toString();
return result;
}