Saat memecahkan ini pertanyaan, saya mendapatkan jawaban yang salah pada beberapa kasus uji masalah menggunakan metode get dari ArrayList langsung dalam pemeriksaan kondisi.

Kode gagal dalam kasus uji:

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));
            }
        }
    }
}

Tetapi ketika ditugaskan sintaks yang sama ke variabel dan menggunakannya untuk pemeriksaan kondisi, itu berlalu.

Kode yang melewati semua kasus uji:

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));
            }              
        }
    }
}

Karena saya baru mengenal Java, saya bingung dengan penggunaan metode get dari ArrayList. Tolong jelaskan kepada saya tentang cara kerja bagian dalam metode get mengapa metode ini gagal atau apakah saya melewatkan sesuatu?

0
Adarsh Srivastava 8 Januari 2021, 11:22

3 jawaban

Jawaban Terbaik

Saya pikir masalahnya terkait dengan tinju/unboxing otomatis tipe Integer. Dalam pernyataan

 if(a==s.peek())

Perbandingan dilakukan membandingkan nilai integer (a) ke Integer unboxed (s.peek()).

Dalam pernyataan

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

Perbandingan dilakukan membandingkan antara dua nilai Integer, yaitu antara dua referensi. Karena kedua referensi berbeda, pemeriksaan kesetaraan gagal.

Untuk memperbaiki pernyataan terbaru, Anda dapat menggunakan:

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

Atau gunakan metode equals dari tipe Integer.

1
user2862981 8 Januari 2021, 08:59

Saya tidak melihat tugas itu sendiri (karena pertanyaan harus mandiri dan saya tidak akan mengunjungi tautan acak) tetapi saya yakin masalahnya berasal dari jenis yang Anda gunakan di sini.

Dalam kasus pertama, m.get(m.size()-1)==s.peek() kedua sisi kanan dan kiri adalah Integers. Karena itu, ketika Anda menggunakan tanda ==, Anda sebenarnya membandingkan referensi objek. Perbandingan seperti itu hanya akan berfungsi kadang-kadang (saya percaya ini untuk bilangan bulat dalam kisaran dari -128 hingga 127). Anda dapat menggunakan equals untuk memperbaiki masalah ini.

Di sisi lain kami memiliki int a = m.get(m.size()-1); if(a==s.peek()). Di sini, di bagian pertama Anda mendapatkan Integer terlebih dahulu tetapi kemudian ditetapkan ke variabel int - unboxing terjadi di sini. Kemudian, ketika Anda memiliki kondisi, Anda membandingkan int dan Integer. Dalam perbandingan seperti itu, Integer dibuka kotaknya ke int dan perbandingan pada int sederhana terjadi di sini (lihat poin pertama di JLS-5.6.2). Karena itu bekerja dengan baik dalam situasi ini.

1
Amongalen 8 Januari 2021, 08:51

s dan m menyimpan objek Integer dan Anda jangan pernah membandingkan objek menggunakan ==.

Ganti m.get(m.size()-1)==s.peek() dengan m.get(m.size()-1).equals(s.peek()) dan kode Anda akan berfungsi.

Alasan mengapa pendekatan kedua Anda berhasil adalah karena dengan menetapkan m.get(m.size()-1) ke variabel int, nilai Integer tidak dikotakkan, dan kemudian perbandingan a==s.peek() dilakukan pada int nilai (nilai dari s.peek() tidak dikotakkan juga).

1
Thomas Kläger 8 Januari 2021, 08:51