Java这段代码为什么会返回 false?传入的是字符串[1,1]
怪我咯
怪我咯 2017-04-18 10:26:30
[Java讨论组]
public boolean  xh_repeat(String[] arry) {
           //用于判断是否有重复值的标记
           boolean flag=false;
           for (int i = 0; i < arry.length; i++) {
            String temp=arry[i];
            int count=0;
            for (int j = 0; j < arry.length; j++) {
              String temp2=arry[j];
             //有重复值就count+1 
             if(temp.equals(temp2)){
              count++;
             }
            }
            //由于中间又一次会跟自己本身比较所有这里要判断count>=2
            if(count>=2){
             flag=true;
            }
           }
           if(flag){
           return true;
           }else{
           return false; //没有
           }
          }
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(5)
阿神

为什么我跑的结果是 true?

public class Test {
    public static void main(String[] args) {
        String[] arr = new String[2];
        arr[0] = "1";
        arr[1] = "1";
        Assert.assertTrue(xh_repeat(arr));
    }

    public static boolean xh_repeat(String[] arry) {
        //用于判断是否有重复值的标记
        boolean flag = false;
        for (int i = 0; i < arry.length; i++) {
            String temp = arry[i];
            int count = 0;
            for (int j = 0; j < arry.length; j++) {
                String temp2 = arry[j];
                //有重复值就count+1
                if (temp.equals(temp2)) {
                    count++;
                }
            }
            //由于中间又一次会跟自己本身比较所有这里要判断count>=2
            if (count >= 2) {
                flag = true;
            }
        }
        if (flag) {
            return true;
        } else {
            return false; //没有
        }
    }
}

你的目的是检查字符串数组是否有重复的吧? 我觉得这样比较简单:

publi boolean isDuplicate(String[] arr) {
    Set<String> set = new HashSet<String>(Arrays.asList(arr));
    return set.size() != arr.length;
}
PHP中文网

想法基本没问题,但是没必要写的那么复杂,一旦遇到重复的了,就可以跳出循环了。写了个简单点的例子:

public boolean xh_repeat(array){
  for(int i =0; i < array.length; i ++){
    String temp = array[i];
    for(int j = 0; j < array.length; j ++){
      if(temp.equals(array[j])){
        return true;
      }
    }
  }

  return false;
}
PHP中文网

虽然你代码风格非常烂,而且算法也不好,但是从代码来看,起码你字符串比较用的是equals方法,所以不可能返回false的。注意,传入的是字符串["1", "1"].
建议这种查找重复直接用map做就好了,空间换时间,O(1)的时间复杂度.

PHP中文网

肯定是false,因为for循环的第二次,count又置为0了。顺便帮你把代码改改

public boolean  xh_repeat(String[] arry) { 
       if(!arry || arry.length==0){
           return false;
       }
       int count = 0;
       for (int i = 0; i < arry.length; i++) {
            String tempI=arry[i];
            for (int j = i+1; j < arry.length; j++) {
                String tempJ=arry[j];
                if(tempI.equals(tempJ)){
                    count++;
                }
            }
       }
       console.info("重复的值有"+count+"个");
  }
巴扎黑

这种方式判断起来比较困难...并且...逻辑太多太复杂,不易读,并且易错

其实判重根本思路就是:是否有字符串出现一次以上,就代表有重复

所以根据这个思路,那可以有以下步骤

  1. 先把数组中的字符串进行分组,转化为一个map,key为字符串,value为其字符串出现的字数

  2. 最后就判断该map中,是否有一个value的值大于1即可

所以推荐用Java8的流来写就能达到这样直观的转换

        String[] arr = {"tom", "jack", "tony", "jack"};

        // 把字符串数组转化为Stream<String>
        boolean b = Arrays.stream(arr)
                          // 按照本身字符串进行分组,分组结果为一个map,其中key为字符串本身,value为该字符串的个数
                          .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                          // 将map转化为Entry流-> Stream<Map.Entry>
                          .entrySet().stream()
                          // 判断若有任何一个Entry的value值大于1,则表示有重复的
                          .anyMatch(stringLongEntry -> stringLongEntry.getValue() > 1);

        System.out.println(b);

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号