ArrayList.remove (int index) не работает с неанонимным объектом класса - PullRequest
4 голосов
/ 21 августа 2010

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 ]

9 голосов
/ 21 августа 2010

В Demo.java вы должны использовать:

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

вместо

 boolean b = list.remove(i) ;

Причина заключается в следующем.ArrayList имеет 2 функции удаления: одну, которая принимает в качестве параметра целое (не целое число!), А другую - в качестве параметра объект.

В первом примере вы использовали первое удаление (как вы преобразовали в int с помощьюintValue ()).Во втором вы пытались удалить объект, представленный целым числом (которого, очевидно, не было в коллекции).

6 голосов
/ 21 августа 2010

Класс 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 голос
/ 21 августа 2010

Проблема возникает потому, что вы звоните list.remove(Object) вместо list.remove(int). Поскольку i является Integer (или 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 не одинаковые типы:)

...