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;
}
}
我真的很困惑,为什么它不起作用...... :(
答案 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)
。由于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
的类型不同:)