使用arraylist的'get'方法回答错误

1aaf6o9v  于 2021-06-27  发布在  Java
关注(0)|答案(3)|浏览(330)

在解决这个问题时,我在使用 get 方法 ArrayList 直接进行状况检查。
测试用例失败的代码:

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        Stack <Integer> s= new Stack<>();
        ArrayList <Integer> m= new ArrayList<>();

        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            if(x==1){
             int y=sc.nextInt();
             if(m.isEmpty() || y>=m.get(m.size()-1))
                 m.add(y);
             s.push(y);  

            }
            else if(x==2){
               // Here I am using `get` to check the last value of ArrayList with the top of stack
               if(m.get(m.size()-1)==s.peek()) {
                   m.remove(m.size()-1);
               }
               s.pop();
            }
            else {
                System.out.println(m.get(m.size()-1));
            }
        }
    }
}

但是当给一个变量分配相同的语法并将其用于条件检查时,它就通过了。
通过所有测试用例的代码:

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        Stack <Integer> s= new Stack<>();
        ArrayList <Integer> m= new ArrayList<>();

        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            if(x==1){
             int y=sc.nextInt();
             if(m.isEmpty() || y>=m.get(m.size()-1))
                 m.add(y);
             s.push(y);  

            }
            else if(x==2){
                // When assigning the same to a variable it passed all test cases.
                int a = m.get(m.size()-1); 
               if(a==s.peek()) {
                   m.remove(m.size()-1);
               }
               s.pop();
            }
            else {
                System.out.println(m.get(m.size()-1));
            }              
        }
    }
}

由于我是java新手,我对 get 方法 ArrayList . 请向我解释一下机器的内部工作原理 get 为什么它失败了,或者我遗漏了什么?

inkz8wg9

inkz8wg91#

我认为这个问题与整数类型的自动装箱/拆箱有关。在声明中

if(a==s.peek())

比较是将a整数值(a)与未装箱整数(s.peek())进行比较。
在声明中

m.get(m.size()-1)==s.peek()

比较是在两个整数值之间进行的,即在两个引用之间。由于两个引用不同,因此相等性检查失败。
要修复最新语句,可以使用:

m.get(m.size()-1).intValue()==s.peek().intValue()

或者使用整数类型的equals方法。

92vpleto

92vpleto2#

s 以及 m 商店 Integer 对象,您不应该使用 == .
替换 m.get(m.size()-1)==s.peek()m.get(m.size()-1).equals(s.peek()) 你的代码也能用。
第二种方法有效的原因是 m.get(m.size()-1) 到一个 int 变量 Integer 值,然后比较 a==s.peek() 是在 int 值(来自 s.peek() 也没有装箱)。

a8jjtwal

a8jjtwal3#

我没有考虑任务本身(作为一个问题应该是独立的,我不打算访问随机链接),但我相信问题来自您在这里使用的类型。
在第一种情况下, m.get(m.size()-1)==s.peek() 左右两侧都是 Integer s。因此,当你使用 == 你实际上是在比较对象引用。这种比较只会在某些时候起作用(我相信它适用于-128到127之间的整数)。你可以用 equals 来解决这个问题。
另一方面,我们有 int a = m.get(m.size()-1); if(a==s.peek()) . 在这里,在第一部分你得到 Integer 首先,然后它被分配给 int 变量拆箱发生在这里。然后,当你有一个条件,你比较 int 和一个 Integer . 在这种比较中 Integer 打开一个 int 简单的比较 int 发生在这里(见jls-5.6.2中的第一点)。正因为如此,它在这种情况下工作正常。

相关问题