4

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

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

4

3 回答 3

9

在 Demo.java 你应该使用:

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

代替

 boolean b = list.remove(i) ;

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

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

于 2010-08-21T14:14:24.947 回答
6

ArrayList类有两个remove方法:

  • 一个接受Object并尝试从列表中删除该对象的对象,以及
  • 一个采用int索引并删除该索引处列表中的对象的方法。

您将变量声明iInteger,因此它也是Object. 因此,您将调用该remove(Object)方法。当您尝试删除时没有任何反应,i因为您的列表中有Pairs,而不是Integers。

你需要做的是将你的变量声明i为一个int,给它一个默认值0(你不能分配null给一个int),然后改变行

boolean b = list.remove(i) ;

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

因为remove(int)返回从列表中删除的对象,而不是boolean指示它是否删除了任何东西。

于 2010-08-21T14:13:53.707 回答
1

出现问题是因为您正在调用list.remove(Object)而不是list.remove(int). 由于iis an Integer(或 an Object)而不是原始类型,JVM 认为您正在尝试删除对象而不是实际索引;因此返回 false 因为您的列表中没有Integer对象。

只需将代码替换为以下代码:

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

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

是的,Java 可以执行

Integer i = 2, j = new Integer(10);
i = i + j;
System.out.println(i.toString());

很好,但int不是Integer同一类型:)

于 2010-08-21T14:14:15.327 回答