尝试计算相同的值两次时,HashMap 的循环不正确且超出范围

Posted

技术标签:

【中文标题】尝试计算相同的值两次时,HashMap 的循环不正确且超出范围【英文标题】:Incorrect loop and out of bound for HashMap when try to count same value twice 【发布时间】:2018-11-04 16:33:51 【问题描述】:

下面的代码接受用户输入(int 值),然后找到重复的偶数计数。

2 个问题

    第一个偶数打印 3 次,如果在您的输入中有 2 7 19 8 它看起来像 2, 2, 2, 8 。为什么我不能 了解。 我将list.get(intNum)+1 用于计算值的hashmap 部分 两次出界。没有它,它就会运行。我怎么算一个 两次?

提前致谢。

public class Various 

    static Scanner userinput= new Scanner(System.in);
    static int nums;
    static int big;//will be used to find bug number in array
    public static void main(String[] args) 

        List<Integer> list= new ArrayList<>();//for all numbers
        List<Integer> listEven= new ArrayList<>(); //just for evens
        Map<Integer,Integer> hmap= new HashMap<Integer,Integer>(); //number count

        System.out.println("Enter some numbers: ");
        nums=userinput.nextInt();
        big=nums;
        int evenNumber;

        list.add(nums);

        while(userinput.hasNextInt())
            nums=userinput.nextInt();

            //below part of the code finds biggest value
            if(nums>big)
                big=nums;
            
            //Above part of the code finds biggest value

            list.add(nums);

            //below part of the code finds/prints duplicate value
            for(int i=0;i<list.size()-1;i++)           
                for(int j=i+1;j<list.size();j++)
                    if(list.get(i)==list.get(j))
                        System.out.println("Duplicate " + list.get(j));
                    
                
                //Above part of the code finds/prints duplicate value
            
            //below part of the code finds even numbers
            for(int i=0;i<list.size();i++)
                //for loop will start from 0 till user input            
                if(list.get(i)%2==0)
                    //if any of those i values%2=0 those will be Even and I will capture those
                    listEven.add(list.get(i));
                
                //Above part of the code finds even numbers
            
            //below part of the code finds number occurrence count          
            for(Integer intNum: list)
                if(!(hmap).containsKey(intNum))
                    hmap.put(intNum, 1);
                else
                    //below part to take care if a number comes twice i add 1 more(+1)
                    hmap.put(intNum, list.get(intNum)+1);
                   
                //Above part of the code finds number occurrence count  
            
        
        System.out.println("Values are " + list);
        System.out.println("Biggest value " + big);
        System.out.println("Even numbers " + listEven);
        System.out.println("Numbers in list and occurance " + hmap);
    

【问题讨论】:

【参考方案1】:

问题 A:

在您的代码中,您有一个检查数字的while 循环,但每次用户输入一个数字时,您都会遍历数字列表并检查偶数。

最合乎逻辑的方法是更改​​您的代码,以便在用户输入所有数字后检查偶数。或者你可以添加这个,这是一个较小的解决方案,但它会起作用:


listEven.add(list.get(i));

把上面的代码改成下面的代码。

if (!listEven.contains(list.get(i))) 
    listEven.add(list.get(i));

问题 B:

错误在于这段代码:

// below part of the code finds number occurrence count
for (Integer intNum : list) 
    if (!(hmap).containsKey(intNum)) 
        hmap.put(intNum, 1);
     else 
        // below part to take care if a number comes twice i add 1
        // more(+1)
        hmap.put(intNum, list.get(intNum) + 1);
    
    // Above part of the code finds number occurrence count


您正在尝试执行list.get(intNum),但是get 方法需要索引,而不是您要查找的值。我认为您的意思是输入 hmap.get(intNum) 而不是 list.get(intNum),这将正确更新计数。

【讨论】:

以上是关于尝试计算相同的值两次时,HashMap 的循环不正确且超出范围的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 和 MySQLi 的预处理语句中使用相同的值两次

PHP & MySQLi - 在下拉列表中显示选定的值两次

当他使用相同的凭据登录两次时如何使用户会话无效

java - 如何在java脚本或jquery中计算相同按钮单击3次和4次时的间隔时间

随机选择目标单元格,但无法针对同一单元格两次

AC日记——计算循环节长度 51nod 1035