ArrayList.remove(int index)不使用非匿名类对象

时间:2010-08-21 13:54:39

标签: java collections arraylist anonymous-class

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

DeleteModule.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以进行删除。 我真的不知道为什么它不起作用。

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

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

3 个答案:

答案 0 :(得分:9)

在Demo.java中你应该使用:

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

而不是

 boolean b = list.remove(i) ;

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

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

答案 1 :(得分:6)

ArrayList类有两个remove方法:

  • 采用Object并尝试从列表中删除该对象的
  • 采用int索引并删除该索引列表中对象的文件。

您将变量i声明为Integer,因此它也是Object。因此,您将调用remove(Object)方法。当您尝试删除i时,没有任何结果,因为您的列表中包含Pair,而不是Integer

您需要做的是将变量i声明为int,将其设为默认值0(您无法将null指定给int boolean b = list.remove(i) ; ),并更改行

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

remove(int)

因为boolean返回从列表中删除的对象,而不是{{1}}表示是否删除了任何内容。

答案 2 :(得分:1)

出现此问题的原因是您正在调用list.remove(Object)而不是list.remove(int)。由于iInteger(或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());

很好,但intInteger的类型不同:)