【问题标题】:Deleting from ArrayList Java从 ArrayList Java 中删除
【发布时间】:2009-11-27 19:50:02
【问题描述】:

我正在尝试通过从 JList 中选择一个项目并单击“删除”来从数组列表中删除它。

到目前为止我的代码,

buttondeleteContact.addActionListener(new ActionListener() {    
  public void actionPerformed(ActionEvent event) {
    if (contactList.getSelectedIndex() != -1) {
      people.removeElementAt(contactList.getSelectedIndex());   
      People.remove(contactList.getSelectedIndex());
      System.out.println(People);
    }
  });

我知道有些东西的名字很糟糕,但是 people(小写 p)是我的 DefaultListModel 的名称,而 People(大写 P)是我的 ArrayList 的名称。基本上,我只想从数组中删除一块 4 行。所以,数组中的位置,以及它后面的 3。

【问题讨论】:

  • 只是出于好奇,这是为了作业吗?如果是的话,我个人不介意。只是在过去的几天里我注意到了几个与联系人列表、地址簿和 GUI 相关的问题......
  • 您要删除一组联系人对象吗?或者您是否将每个联系人的所有数据存储在数组列表中?如果是这样,请参阅 BalusC 的答案并尝试封装代码。它会让你的生活更轻松。

标签: java arraylist


【解决方案1】:

虽然ListArrayList 没有直接(且可访问的)removeRange() 方法,但通过提供subList() 方法可以消除对此类方法的需求。

subList() 提供原始列表的一部分的视图。需要注意的重要部分是修改返回的List 也会修改原始的List。因此,要删除索引为indexindex+3 的元素,您可以这样做:

myList.subList(index, index+4).clear();

注意subList() 的第二个参数是独占的,所以这个subList() 调用将返回一个大小为4 的List

【讨论】:

    【解决方案2】:

    这是一个奇怪的要求。在它之后删除3个项目?它们是如何相互关联的?它们必须以某种方式相互关联。听起来您的联系人列表如下所示:

    List<String> contacts = new ArrayList<String>();
    contacts.add("John Doe");
    contacts.add("Main street 1"); // His street.
    contacts.add("New York"); // His city.
    contacts.add("555 123 456 789"); // His phone.
    // etc..
    

    这是真的吗?然后你真的应该考虑将相关元素分组到另一个真实世界的表示对象中。您可以创建一个 Javabean 类 Contact,如下所示:

    public class Contact {
        private String name;
        private String street;
        private String city; // You could consider another Address class for street and city as well.
        private String phone;
        // Add/generate getters and setters.
    
        public Contact() {
            // Keep default constructor alive.
        }
    
        public Contact(String name, String street, String city, String phone) {
            this.name = name;
            this.street = street;
            this.city = city;
            this.phone = phone;
        }
    }
    

    这样你就结束了

    List<Contact> contacts = new ArrayList<Contact>();
    contacts.add(new Contact("John Doe", "Main Street 1", "New York", "555 123 456 789"));
    // etc..
    

    这样您就可以按索引删除单个 real Contact

    您甚至可以将其设为People 的属性:

    public class People {
        private List<Contact> contacts;
        // +getter +setter
    }
    

    尝试思考 OO。

    【讨论】:

      【解决方案3】:

      Joachim 的回答提供了一种直接从 ArrayList 中删除的好方法,但我怀疑您真的想直接从模型中删除范围。 DefaultListModel 有一个 removeRange 方法:

      int index = contactList.getSelectedIndex();
      people.removeRange(index, index + 4);
      

      我希望它具有正确的行为,也可以从基础列表中删除项目。假设是这种情况,那将是我怀疑的最佳方法。再说一次,我不太了解 Swing :)

      【讨论】:

      • 哈哈......在我意识到我的错误之前,这些名字给我带来了很多痛苦:) 但是,是的,eclipse 似乎不喜欢 removeRange。我收到错误“ArrayList 类型的方法 removeRange(int, int) 不可见”
      • 与其将第4项删除4次,有时如果向后删除更容易理解;第 7、6、5、4 项。
      • @rsp:我想我个人会觉得这更难理解。请注意,它更有效:)
      • 在 Java 中是people.subList(index, index+4).clear()subList() 方法不需要只作用于选定范围的专用方法。
      • @Joachim:好地方。完全忘记了子列表。将编辑。
      【解决方案4】:

      试试,

      people.subList(index, index+4).clear()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-23
        • 2015-08-05
        • 2017-06-13
        • 2010-11-21
        • 2013-01-26
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        相关资源
        最近更新 更多