4

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

なぜそれが機能しないのか私は本当に混乱しています...:(

4

3 に答える 3

9

Demo.javaでは、次を使用する必要があります。

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

それ以外の

 boolean b = list.remove(i) ;

その理由は以下のとおりです。ArrayListには2つの削除関数があります。1つはパラメーターとしてint(整数ではありません!)を取り、もう1つはパラメーターとしてObjectを取ります。

最初の例では、最初のremoveを使用しました(intValue()を使用してintに変換したため)。2番目の例では、整数で表されるオブジェクトを削除しようとしました(これは明らかにコレクションに含まれていませんでした)。

于 2010-08-21T14:14:24.947 に答える
6

ArrayListクラスには2つのメソッドremoveがあります。

  • を取り、Objectそのオブジェクトをリストから削除しようとするもの、および
  • インデックスをint取得し、そのインデックスのリスト内のオブジェクトを削除するもの。

i変数をとして宣言したIntegerので、それもObjectです。したがって、メソッドを呼び出すことになりますremove(Object)iリストにはPairsではなくsが含まれているため、削除しようとしても何も起こりませんInteger

変数iをとして宣言intし、デフォルト値(に割り当てること0はできません)を指定して、行を変更する必要があります。nullint

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)iInteger(または)であり、プリミティブ型ではないためObject、JVMは、実際のインデックスではなくオブジェクトを削除しようとしていると見なします。Integerしたがって、リストにオブジェクトがないため、falseを返します。

コードを次のコードに置き換えるだけです。

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 に答える