急求!怎么这做判断啊 不相等 retrun老是返回正确的

怎么判断这个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

8个回答

看了你的代码的逻辑,result集合第一个元素和list比较,只要触发不相等的,就直接返回;【这样的话,没有把集合元素全部比较】

而你提问的问题,是想result集合的第一个元素,和list全部比较完毕后,不存在返回false,否则返回true;

那么你的代码逻辑需要调整;,可以反过来,只要有相等的,返回true,外面return false;

不知道我理解的,是否是你需要的

falali19880120
千秋无痕 回复qq_36604562: 好的,我在回复区放个微信群图片
接近 2 年之前 回复
qq_36604562
qq_36604562 回复falali19880120: 加个联系方式说?
接近 2 年之前 回复
falali19880120
千秋无痕 回复qq_36604562: 我拷贝下来,不全,你直接说把,this.verify方法实现是什么
接近 2 年之前 回复
qq_36604562
qq_36604562 public interface Legality { /** * 验证设备合法性 * * @param msg * @return */ boolean verify(String msg); }
接近 2 年之前 回复
qq_36604562
qq_36604562 回复falali19880120: public class ParserImpl implements Parser { private static final Logger LOG = LoggerFactory.getLogger(ParserImpl.class); @Autowired private Legality legality; public void parse(String msg) { // 1. 验证设备合法性 if (!this.verify(msg)) { return ; }private boolean verify(String msg) { return this.legality.verify(msg); }
接近 2 年之前 回复
falali19880120
千秋无痕 回复qq_36604562: 能把你修复后的代码贴出来么,另外this.verify 和this.legality.vefiry,我看了下,不是很清楚,this.verify 会调用this.legality.verify么
接近 2 年之前 回复
qq_36604562
qq_36604562 回复: 而且我在试了数据 当result数据存在list里面他还是跳转return flase
接近 2 年之前 回复
falali19880120
千秋无痕 回复qq_36604562: 这是另外一个问题,等下我吃晚饭回来看下,你想问什么,先组织一下,回复给我
接近 2 年之前 回复
qq_36604562
qq_36604562 回复: 我要做的是如果false就不做处理 不跳转到这个方法来 true的话就跳转过来
接近 2 年之前 回复
qq_36604562
qq_36604562 他return false还是会跳转到private boolean verify(String msg) { return this.legality.verify(msg); }这个里面来 那我该怎么处理呢
接近 2 年之前 回复
 for (int i = 0; i < list.size(); i++) {
        if(!list.get(i).equals(results.get(0))){
            return false;
        }else{
                   return true;
                }
    }


qq_23126581
渊渟无迹静涛君 回复qq_36604562: 定义一个全局变量默认为false,然后判断真就返回true,不能else了。
接近 2 年之前 回复
qq_36604562
qq_36604562 当false时候他还是返回到return this.legality.verify(msg)这里面来了 另外如果下面不再写return true 他会提示miss return statement
接近 2 年之前 回复
 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

xingjianfengaa
xingjianfengaa 回复xingjianfengaa: 你不是有println(result)和println(list)吗这不是一眼就看到了吗,我劝你还是cokntains吧,list的成员函数,多方便
接近 2 年之前 回复
xingjianfengaa
xingjianfengaa 回复qq_36604562: 空值应该是会出错的
接近 2 年之前 回复
qq_36604562
qq_36604562 回复xingjianfengaa: 我现在list用get那个方法获取是个空值 刚测打印的false
接近 2 年之前 回复
xingjianfengaa
xingjianfengaa 回复qq_36604562: 你在for之前 加上System.out.println(list.contains(result));这一句看看打印 是true还是false
接近 2 年之前 回复
xingjianfengaa
xingjianfengaa 回复qq_36604562: 你说现在不存在的数据也返回true吗
接近 2 年之前 回复
qq_36604562
qq_36604562 现在我的判断语句这块
接近 2 年之前 回复
qq_36604562
qq_36604562 List<String> list = redisTools.getDeviceCodeList(); System.out.println(result); System.out.println(list); for (int i = 0; i < list.size(); i++) { if(list.get(i).equals(result)){ //如果list中有一个和result相同,则是合法的,返回true return true; } } //否则返回false,代表list中没有一个和result相同 return false; }
接近 2 年之前 回复
xingjianfengaa
xingjianfengaa 回复: 如果按你贴出来的代码 如果list .size>1那么它可能 永远是false,我说的是内容不一样的情况下
接近 2 年之前 回复
xingjianfengaa
xingjianfengaa 回复qq_36604562: 你有修改代码么,就按照你之前贴出来的,不存在会返回true?
接近 2 年之前 回复
qq_36604562
qq_36604562 回复xingjianfengaa: 但是我测试我的数据没有在list里面的话 就是数据不存在 但是为什么还是return ture转到那个逻辑代码里面去了
接近 2 年之前 回复
xingjianfengaa
xingjianfengaa return this.legality.verify(msg)这个不就是你写逻辑的函数吗 ,你里面return false 或true了 就是这个函数结束了,肯定要返回到上层也就是return this.legality.verify(msg)呀
接近 2 年之前 回复
xingjianfengaa
xingjianfengaa 还有你可以找印出来 list和results 看里面的字符串是不是真的完全一样 说不定你list里的字符串多个空格什么的呢
接近 2 年之前 回复

你这一段代码写的我不知道该怎么说才好,感觉代码写的很水,建议写代码的时候多想想,提高一下质量。
我简单举几个例子:
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;
}
}
}
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐