I'm trying to get the items difference between two lists, but, sometimes one list is bigger than other, sometimes one is smaller and sometimes they are equal. Also, missing objects can happen in both lists.
I found good solutions to get the difference between two lists, like How can I return the difference between two lists?, but no one considers 2 lists.
I saw Find common and different elements between two list in java too, but it isn't exactly what I'm asking.
I elaborate one example to illustrate what I want to do.
Consider one list of ordered items, and one list of sent items. They must be equal because client must receive the items that he ordered.
So I did this way:
public class Main {
public static void main(String[] args) {
// Case 1
List<String> order1 = Arrays.asList(new String[] { "A", "B" });
List<String> sended1 = Arrays.asList(new String[] { "A", "B" });
// No difference
System.out.println("Case 1: " + getDifference(order1, sended1));
// Case 2
List<String> order2 = Arrays.asList(new String[] { "A", "B", "C" });
List<String> sended2 = Arrays.asList(new String[] { "B", "C" });
// "1 item(s) missing in sended: A"
System.out.println("Case 2: " + getDifference(order2, sended2));
// Case 3
List<String> order3 = Arrays.asList(new String[] { "A", "D" });
List<String> sended3 = Arrays.asList(new String[] { "A", "B", "C", "D" });
// "2 item(s) missing in order: B, C"
System.out.println("Case 3: " + getDifference(order3, sended3));
// Case 4
List<String> order4 = Arrays.asList(new String[] { "A", "D", "F" });
List<String> sended4 = Arrays.asList(new String[] { "A", "B", "C", "D" });
// 1 item(s) missing in sended: "F" & 2 item(s) missing in order: "B", "C"
System.out.println("Case 4: " + getDifference(order4, sended4));
}
private static String getDifference(List<String> order, List<String> sended) {
StringBuilder output = new StringBuilder();
if (order.equals(sended)) {
output.append("No difference");
} else {
List<String> auxOrder = new ArrayList<>(order);
auxOrder.removeAll(sended);
if (auxOrder.size() > 0) {
output.append(auxOrder.size()).append(" item(s) missing in sended: ");
output.append("\"").append(String.join("\", \"", auxOrder)).append("\"");
}
List<String> auxSended = new ArrayList<>(sended);
auxSended.removeAll(order);
if (auxSended.size() > 0) {
if (output.length() > 0) {
output.append(" & ");
}
output.append(auxSended.size()).append(" item(s) missing in order: ");
output.append("\"").append(String.join("\", \"", auxSended)).append("\"");
}
}
return output.toString();
}
}
It works, but I'm not sure that it is the best way to do it, so I ask for your help!