两个无序list比较是否相同,一个list是否包含另一个list。

前景:正确答案有多个,用户的答案也有多个,两个答案进行比较,少答但没有错答给一分。

1、比较两个无序list是否相同

   1、String数组处理

//用户答案
String[] astr = {"1","2"};
//正确答案
String[] ans = {"2","1"};

//将两个数组的数据分别进行一次排序,从小到大
//lambda表达式写法,把参数分别传给String的compareTo方法
Arrays.sort(astr, String::compareTo);
Arrays.sort(ans, String::compareTo);

//分别放入两个list中
List asList = Arrays.asList(astr);
List bsList = Arrays.asList(ans);

//equalList方法后面贴代码
boolean eq = equalList(asList, bsList);
System.out.println("两list是否相同:" + eq);

    2、list处理

//用户答案
List ureslists = new ArrayList() {
    {
       add("2");
       add("1");
    }
};
//正确答案
List anslists = new ArrayList() {
   {
      add("1");
      add("2");
   }
};

//进行排序,lambda表达式
Collections.sort(ureslists, (res1, res2) -> (res1.compareTo(res2)));
anslists.sort(String::compareTo);

//equalList代码后面贴出来
boolean eq = equalList(ureslists , anslists);
System.out.println("两list是否相同:" + eq);

equalList方法代码如下: 

public boolean equalList(List list1, List list2) {
        if (list1.size() != list2.size()) {
            return false;
        }
        for (Object object : list1) {
            if (!list2.contains(object))
                return false;
        }
        return true;
    }

2、一个list是否包含另一个list的数据 

List asList = new ArrayList() {
    {
        add("1");
    }
};
List bsList = new ArrayList() {
    {
        add("1");
        add("2");
    }
};
// list自带的方法,containsAll:BList数据是否包含AList数据,全部数据比较
//contains:BList是否包含某一个数据
boolean ca = bsList.containsAll(asList);

 完整测试代码:

@Test
    public void testResult() {
//学生答案
        Map map = new HashMap<>();
        map.put("1", "1,2");
        map.put("2", "1");
        map.put("3", "1,2,3");
        Integer num = 0;
        boolean eq = false;
        boolean ca = false;
        for (String key : map.values()) {
            num = jisuan(key, eq, ca, num);
        }
        System.out.println("总分:" + num);
    }

    @Test
    public void testListSort() {
        //用户答案
        List ureslists = new ArrayList() {
            {
                add("2");
                add("1");
            }
        };
//正确答案
        List anslists = new ArrayList() {
            {
                add("3");
                add("2");
            }
        };
//进行排序
        Collections.sort(ureslists, (java1, java2) -> (java1.compareTo(java2)));
        anslists.sort(Comparator.comparing(String::toString));
//        anslists.sort(String::compareTo);
        ureslists.forEach(s -> System.out.println(s));
        System.out.println("----------------------------------");
        anslists.forEach(s -> System.out.println(s));
    }

    /**
     * 统计分数
     * @param key   用户答案
     * @param eq    是否全部相同
     * @param ca    是否答对一部分
     * @param num   分数
     * @return
     */
    public int jisuan(String key, boolean eq, boolean ca, Integer num) {
        String[] astr = key.split(",");
//            正确答案
        String[] ans = {"2","1"};
        Arrays.sort(astr, String::compareTo);
        Arrays.sort(ans, String::compareTo);
        List asList = Arrays.asList(astr);
        List bsList = Arrays.asList(ans);
//        检查是否全对,如果是全对,则给满分
        eq = equalList(asList, bsList);
        if (eq) {
            System.out.println("全部相同则全对");
            num += 2;
        } else {
//            如果不是全对,则看是否有答错
            ca = bsList.containsAll(asList);
            if (ca) {
                System.out.println("用户只是少答,但是没错答,给1分");
                num += 1;
            } else {
                System.out.println("答错,多答");
            }
        }
        System.out.println("两list是否相同:" + eq);
        System.out.println("b是否包含a:" + ca);
        return num;
    }

    /**
     * 两个list是否相同
     * @param list1
     * @param list2
     * @return
     */
    public boolean equalList(List list1, List list2) {
        if (list1.size() != list2.size()) {
            return false;
        }
        for (Object object : list1) {
            if (!list2.contains(object))
                return false;
        }
        return true;
    }

 

 上面的排序都是用lambda表达式来完成的,java11已经推出稳定版了,java8的重要语法我们还是有必要掌握基本用法的。在实际开发中,注释还是写清楚一点,不然会让人家看的很难受。哈哈!

 

另外推荐一篇:这个博主用的是重写equal和hashcode的方法,我也学一下

Java 判断2个List集合是否相等,不考虑元素的顺序:https://blog.csdn.net/qq_27093465/article/details/82777139

你可能感兴趣的:(java)