java基础--集合--判断两个集合元素以及元素顺序是否相等
java基础--集合--判断两个集合元素以及元素顺序是否相等
1 ListUtils.isEqualList
ListUtils.isEqualList(Collection<?> list1, Collection<?> list2)
import org.apache.commons.collections4.ListUtils;
Jar包地址
http://maven.outofmemory.cn/org.apache.commons/commons-collections4/4.0/
源码
public static boolean isEqualList(Collection<?> list1, Collection<?> list2) {
if (list1 == list2) {
return true;
} else if (list1 != null && list2 != null && list1.size() == list2.size()) {
Iterator<?> it1 = list1.iterator();
Iterator<?> it2 = list2.iterator();
Object obj1 = null;
Object obj2 = null;
while(true) {
if (it1.hasNext() && it2.hasNext()) {
obj1 = it1.next();
obj2 = it2.next();
if (obj1 == null) {
if (obj2 == null) {
continue;
}
} else if (obj1.equals(obj2)) {
continue;
}
return false;
}
return !it1.hasNext() && !it2.hasNext();
}
} else {
return false;
}
}
2 containsAll 此方法不能判断顺序相等
/**
* @Author liuhaidong
* @Description 方式2 containsAll 仅能判断内容,不能判断顺序
* @param
* @Date 11:42 2019/10/7 0007
*/
private static boolean isTrue(List<Integer> list1,List<Integer> list2){
if(list1 == null && list2 == null){
return true;
}
if(list1 != null && list1.containsAll(list2) &&
list2 != null && list2.containsAll(list1)){
return true;
}else {
return false;
}
}
3 contains 此方法不能判断顺序相等
/**
* @Author liuhaidong
* @Description 方式3 contains 仅能判断内容,不能判断顺序
* @param
* @Date 11:52 2019/10/7 0007
*/
public static boolean equals(List<Integer> listOne,List<Integer> listTwo) {
if(listOne ==null || listTwo == null){
return false;
}
int length = listOne.size();
int count = 0;
for(Integer a : listOne){
if(listTwo.contains(a)){
count +=1;
}
}
if(count == length){
return true;
}
return false;
}
4 retainAll 此方法不能判断顺序相等
//如果集合A和集合B是完全相同的集合,也会返回false。两个集合没有交集,才会返回true。简单来说,
// 判断两个集合是否有交集,有则返回false,无则返回true(这句话不严谨)。
// 总结来说只有两个任何一个元素都不相等时才会返回true,否则返回false。
System.out.println("*************************方式4 retainAll******************************");
System.out.println(!listOne.retainAll(listTwo));
System.out.println(!listOne.retainAll(listThree));
5 MD5
/**
* md5加密法使用
* 方法5 md5 能判断内容,能判断顺序
*/
private static boolean getDiffrent(List<Integer> list, List<Integer> list1) {
/** 使用Security的md5方法进行加密 */
Mademd5 md5 = new Mademd5();
String str = md5.toMd5(list.toString());
String str1 = md5.toMd5(list1.toString());
return str.equals(str1);
}
6 使用list转成字符串进行比较是否相等
/**
* @Author liuhaidong
* @Description 使用list转成字符串进行比较是否相等 使用list自带的sort方法先进行排序,然后转成toString去判断两个集合是否相等
* 仅能判断内容,不能判断顺序
* @param
* @Date 12:21 2019/10/7 0007
*/
// private static boolean ToSort(List<String> list, List<String> list1) {
// list.sort(Comparator.comparing(String::hashCode));
// list1.sort(Comparator.comparing(String::hashCode));
// return list.toString().equals(list1.toString());
// }
private static boolean ToSort(List<Integer> list, List<Integer> list1) {
list.sort(Comparator.comparing(Integer::intValue));
list1.sort(Comparator.comparing(Integer::intValue));
return list.toString().equals(list1.toString());
}
7使用stream流去比较两个数组是否相等
/**
* @Author liuhaidong
* @Description 使用stream流去比较两个数组是否相等
* @param
* @Date 12:39 2019/10/7 0007
*/
private static boolean usingStream(List<Integer> list, List<Integer> list1) {
List<String> newlist = new ArrayList<>(list.size());
List<String> newList1 = new ArrayList<>(list1.size());
for (Integer myInt : list) {
newlist.add(String.valueOf(myInt));
}
for (Integer myInt1 : list1) {
newList1.add(String.valueOf(myInt1));
}
/** 先将集合转成stream流进行排序然后转成字符串进行比较 */
return newlist.stream().sorted().collect(Collectors.joining())
.equals(newList1.stream().sorted().collect(Collectors.joining()));
}
结果
主函数
public static void main(String[] args) {
List<Integer> listOne = new ArrayList<>();
listOne.add(1);
listOne.add(2);
listOne.add(3);
List<Integer> listTwo = new ArrayList<>();
listTwo.add(3);
listTwo.add(2);
listTwo.add(1);
List<Integer> listThree = new ArrayList<>();
listThree.add(1);
listThree.add(2);
listThree.add(3);
//方式1 引入jar包
System.out.println("*************************方式1 collections4******************************");
System.out.println(ListUtils.isEqualList(listOne,listTwo));
System.out.println(ListUtils.isEqualList(listOne,listThree));
//方式2 containsAll 此方法不能判断顺序相等
System.out.println("*************************方式2 containsAll******************************");
System.out.println(isTrue(listOne,listTwo));
System.out.println(isTrue(listOne,listThree));
//方式3 contains 此方法不能判断顺序相等
System.out.println("*************************方式3 contains******************************");
System.out.println(equals(listOne,listTwo));
System.out.println(equals(listOne,listThree));
//方式4 retainAll 此方法不能判断顺序相等
//如果集合A和集合B是完全相同的集合,也会返回false。两个集合没有交集,才会返回true。简单来说,
// 判断两个集合是否有交集,有则返回false,无则返回true(这句话不严谨)。
// 总结来说只有两个任何一个元素都不相等时才会返回true,否则返回false。
System.out.println("*************************方式4 retainAll******************************");
System.out.println(!listOne.retainAll(listTwo));
System.out.println(!listOne.retainAll(listThree));
System.out.println("*************************方式5 md5方法进行加密******************************");
System.out.println(getDiffrent(listOne,listTwo));
System.out.println(getDiffrent(listOne,listThree));
System.out.println("*************************方式6 转化为字符串进行排序Comparator.comparing******************************");
System.out.println(ToSort(listOne,listTwo));
System.out.println(ToSort(listOne,listThree));
System.out.println("*************************方式7 使用stream流去比较两个数组是否相等******************************");
System.out.println(usingStream(listOne,listTwo));
System.out.println(usingStream(listOne,listThree));
}