java - ArrayList.remove(int index) 不适用于非匿名类对象

标签 java collections arraylist anonymous-class

ArrayList.remove(int index) 正在使用 ActionListener 类的匿名实例:-

删除模块.java :-

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;



class MyFrame extends JFrame{

    private ArrayList<String> list = new ArrayList<String>() ; 
    private JButton btn = new JButton("Enter index to delete : ") ;
    private JTextField fld = new JTextField() ;

    MyFrame(){
        populateList() ;

        setLayout(new GridLayout(1, 2)) ;
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) ;
        setSize(400, 60) ;

        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                list.remove( Integer.parseInt( fld.getText() ) ) ;
                JOptionPane.showConfirmDialog(null, list, "Total Elements : " + list.size(), JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ;
            }
        });

        add(btn) ;
        add(fld) ;

        setTitle("Total Elements : " + list.size()) ;

        setVisible(true) ;
    }

    private void populateList(){
        for(int i = 1 ; i <= 5 ; ++i){
            list.add("Key " + i) ;
        }
    }
}

public class DeleteModule {

    public static void main(String[] args) {
        new MyFrame() ;
    }
}

但是当我将它与原始模块集成时(下面是修改后的简化源代码,其中包含 DeleteFromPoolListener.class 的非匿名实例),它返回 false 进行删除。 我真的不知道为什么它不起作用。

演示.java

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

class MyFrame extends JFrame{

    private ArrayList<Pair> list = new ArrayList<Pair>() ;

    private JButton deleteBtn = new JButton("Delete Pair at index : ") ;
    private JTextField deleteIndexText = new JTextField() ;

    MyFrame(){
        populateList() ;
        setTitle("List size : " + list.size()) ;
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) ;

        JPanel lowerPanel = new JPanel() ;
        lowerPanel.setLayout(new GridLayout(2, 1)) ;

        deleteBtn.addActionListener(new DeleteFromPoolListener()) ; lowerPanel.add(deleteBtn) ;
        lowerPanel.add(deleteIndexText) ;
        add(lowerPanel) ;
        pack() ;
        setVisible(true) ;
    }

    private void populateList(){
        for(int i = 1 ; i <= 5 ; ++i){
            list.add( new Pair( "Key " + i, "Value " + i ) ) ;
        }
    }


    class DeleteFromPoolListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {

            Integer i = null ;
            try{
                i = Integer.parseInt(deleteIndexText.getText().trim()) ;
                boolean b = list.remove(i) ;

                JOptionPane.showConfirmDialog(null, list + "\n\n" + "Deleted : " + b + " from index " + i, "List size : " + list.size(), JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ;
                setTitle("Total Pairs : " + list.size()) ;
                deleteIndexText.setText("") ;
            }
            catch(NumberFormatException nfe){
                JOptionPane.showConfirmDialog(null, "Enter numeric value in range.", "Error", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ;
                deleteIndexText.setText("") ;
            }       
        }
    }
} 



public class Demo {

    public static void main(String[] args) {
        new MyFrame() ;
    }
}

class Pair{

    private String key ;
    private String value ;

    Pair(String k, String v){
        key = k ;
        value = v ;
    }

    public String toString() {
        return "[" + value + "]" ;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

我真的很困惑为什么它不起作用...:(

最佳答案

在 Demo.java 中你应该使用:

 boolean b = (list.remove(i.intValue()) != null)

代替

 boolean b = list.remove(i) ;

原因如下。 ArrayList 有 2 个删除函数:一个以 int(不是 Integer!)作为参数,另一个以 Object 作为参数。

在您的第一个示例中,您使用了第一个删除(因为您使用 intValue() 转换为 int)。在第二个中,您试图删除由 Integer 表示的对象(它显然不在集合中)。

关于java - ArrayList.remove(int index) 不适用于非匿名类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3537848/

相关文章:

java - SpringJUnit4ClassRunner : run test method multiple times with different input data

java - 当单元格包含空值时从excel中获取数据

java - Selenium 错误: "org.openqa.selenium.SessionNotCreatedException: session not created from tab crashed" after update electron engine to 9. 0.3

java - 两个集合的左外连接

java - ArrayList 仅检测最后添加的对象的碰撞

java - 使用 InjectionPoint for @Produce 对自定义限定符的方法进行 JUnit 测试

javascript - 将 Backbone.js JSON 响应填充到嵌套集合/模型内的嵌套集合中

java - 在 Java8 上使用新 API 进行反向排序

java - 如何允许 ArrayList 删除添加的对象而不覆盖或使其不可变

java - 私有(private)类ArrayList(集合)