怎么判断这个list里面的值是否在另一个list里面存在 存在的话返回true 返回到这个方法里面
不存在的话不做处理
public class LegalityImpl implements Legality {
@Autowired
private RedisTools redisTools;
@Override
public boolean verify(String msg) {
int start = msg.indexOf("MN"); // 获取第一次/出现的位置
int end = msg.lastIndexOf(";CP"); // 获取最后一次.出现的位置
String result = msg.substring(start, end).replace("MN=", " ");
result=result.replace(" ","");
List<String>results=Arrays.asList(result);
List<String> list = redisTools.getDeviceCodeList();
for (int i = 0; i < list.size(); i++) {
if(!list.get(i).equals(results.get(0))){
return false;
}
}
return true;
}
public interface Legality {
/**
* 验证设备合法性
*
* @param msg
* @return
*/
boolean verify(String msg);
}
public class ParserImpl implements Parser {
private static final Logger LOG = LoggerFactory.getLogger(ParserImpl.class);
@Autowired
private Legality legality;
@Override
public void parse(String msg) {
// 1. 验证设备合法性
if (!this.verify(msg)) {
return ;
}
private boolean verify(String msg) {
return this.legality.verify(msg);
}
其中result的值为399HOLL0000219
看了你的代码的逻辑,result集合第一个元素和list比较,只要触发不相等的,就直接返回;【这样的话,没有把集合元素全部比较】
而你提问的问题,是想result集合的第一个元素,和list全部比较完毕后,不存在返回false,否则返回true;
那么你的代码逻辑需要调整;,可以反过来,只要有相等的,返回true,外面return false;
不知道我理解的,是否是你需要的
for (int i = 0; i < list.size(); i++) {
if(!list.get(i).equals(results.get(0))){
return false;
}else{
return true;
}
}
public boolean verify(String msg) {
int start = msg.indexOf("MN"); // 获取第一次/出现的位置
int end = msg.lastIndexOf(";CP"); // 获取最后一次.出现的位置
String result = msg.substring(start, end).replace("MN=", " ");
result = result.replace(" ","");
//List<String>results=Arrays.asList(result); 看你的代码这一步是无用的,下面直接用result就行了
List<String> list = redisTools.getDeviceCodeList();
for (int i = 0; i < list.size(); i++) {
if(list.get(i).equals(result)){
//如果list中有一个和result相同,则是合法的,返回true
return true;
}
}
//否则返回false,代表list中没有一个和result相同
return false;
}
请问楼主 是不是这个意思?
for (int i = 0; i < list.size(); i++) {
if(!list.get(i).equals(results.get(0))){
continue;
}else{
return true;
}
}
如果需要遍历完所有元素也未找到相等的值时不做返回,可在方法最后抛出异常
throw new RuntimeException;
contains方法判断列表中是否包含某个对象
for (int i=0; i<list.size(); i++) {
if (results.contains(list.get(i))) {
return true;
}
}
return false;
首先 你判断逻辑有问题,你为何把string result转换成 list results,其实你用list.get(i).equals(result)也是一样的,再次,不用你亲自for循环,你可以用list.contains(results.get(0)),包含就是true,else 就是false,
还有看你上面说的会跳转到return this.legality.verify(msg); 那说明你的程序进入 了public void parse(String msg) {
// 1. 验证设备合法性
if (!this.verify(msg)) {
return ;
}
private boolean verify(String msg) {
return this.legality.verify(msg);
}
这个函数,而我看到的这里面的this.verify跟public boolean verify(String msg)并不是同一个函数吧,并不在同一个类中,你看看是不是还有另一个地方调用了你展示出来的verify
你这一段代码写的我不知道该怎么说才好,感觉代码写的很水,建议写代码的时候多想想,提高一下质量。
我简单举几个例子:
int start = msg.indexOf("MN"); // 获取第一次/出现的位置
int end = msg.lastIndexOf(";CP"); // 获取最后一次.出现的位置
String result = msg.substring(start, end).replace("MN=", " ");
result=result.replace(" ","");
上面这四行完全可以合并为一行;
List<String>results=Arrays.asList(result);
上面这一行转List完全没有意义;
for (int i = 0; i < list.size(); i++) {
上面这一行完全可以用foreach或者lambda表达式代替,java8以后的特性,建议多使用,提高代码简洁渡;
if(!list.get(i).equals(results.get(0))){
上面这一行完全可以用contains代替。
至于你的疑问,为什么总是返回true呢,你把List list = redisTools.getDeviceCodeList();这个List中的内容打印出来看一下就明白了。
public boolean verify(String msg) {
int start = msg.indexOf("MN"); // 获取第一次/出现的位置
int end = msg.lastIndexOf(";CP"); // 获取最后一次.出现的位置
String result = msg.substring(start, end).replace("MN=", " ");
result=result.replace(" ","");
Listresults=Arrays.asList(result);
List list = redisTools.getDeviceCodeList();
for (int i = 0; i < list.size(); i++) {
for(int j=0;j<results.size();j++){
if(list[i]==results[j]){
return false;
}
}
}
}