前景:正确答案有多个,用户的答案也有多个,两个答案进行比较,少答但没有错答给一分。
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;
}
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