mog*_*gli 4 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() ;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我将它与原始模块集成时(下面是使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我真的很困惑,为什么它不工作...... :(
在Demo.java中你应该使用:
boolean b = (list.remove(i.intValue()) != null)
Run Code Online (Sandbox Code Playgroud)
代替
boolean b = list.remove(i) ;
Run Code Online (Sandbox Code Playgroud)
原因如下.ArrayList有2个删除函数:一个将参数作为参数(不是整数!),另一个作为参数作为参数.
在第一个示例中,您使用了第一个删除(当您使用intValue()转换为int时).在第二个中,您试图删除由Integer表示的Object(显然不在集合中).
该ArrayList的类有两个remove方法:
Object并尝试从列表中删除该对象的一个,以及int索引并删除该索引中列表中的对象.你声明你的变量i是一个Integer,所以它也是一个Object.因此,您将调用该remove(Object)方法.当你尝试删除时没有任何反应,i因为你的列表中有Pairs,而不是Integers.
你需要做的是将你的变量声明i为int,给它一个默认值0(你不能分配null给一个int),并改变这一行
boolean b = list.remove(i) ;
Run Code Online (Sandbox Code Playgroud)
至
boolean b = (list.remove(i) != null) ;
Run Code Online (Sandbox Code Playgroud)
因为remove(int)返回从列表中删除的对象,而不是boolean指示是否删除了任何内容.
| 归档时间: |
|
| 查看次数: |
6825 次 |
| 最近记录: |