【问题标题】:Comparing Substrings to JList Strings将子字符串与 JList 字符串进行比较
【发布时间】:2013-12-25 21:21:33
【问题描述】:

如果我没有为我的问题提供足够的背景信息,请提前原谅我。长期阅读,第一次提问。

我正在制作一个程序,其中有一个通过制表符分隔的 .txt 文件访问的汽车数据库(我们最近在我的编程课上做了类似的事情,所以我想扩展它)。

我的格式不是使用终端窗口,而是在 ArrayList 中显示 Car 对象(包含品牌、型号、年份、价格等)。我正在使用 JFrame、JList 和 ListModel,因为我使用的是 Car 对象数组。

在我的程序中,我想创建一个删除方法,让用户可以从数据库中删除项目。最初,他们会从 JList 中选择项目,然后单击删除按钮。这会调用 delete() 方法,也就是下图所示的选项卡...

void delete()
    {
        int i = list.getSelectedIndex();
        String string = (String)listModel.getElementAt(i); 


        for(Car c : cars)
        {
            String year = String.valueOf(c.getYear());
            String conditionReport = String.valueOf(c.getConditionReport());
            String price = String.valueOf(c.getPrice());

            if(c.getMake().indexOf(string) != -1 && c.getModel().indexOf(string) != -1 && year.indexOf(string) != -1 && conditionReport.indexOf(string) != -1 && price.indexOf(string) != -1 && c.getWarranty().indexOf(string) != -1 && c.getComments().indexOf(string) != -1)
            {
                int choice = JOptionPane.showConfirmDialog(null, "Are you sure you would like to remove the "  + cars.get(i).getYear() + " " + cars.get(i).getMake() + " " + cars.get(i).getModel() + "?", "Choose One", JOptionPane.YES_NO_OPTION);
                if(choice == JOptionPane.NO_OPTION || choice == JOptionPane.CLOSED_OPTION)
                {
                    return;
                } else
                {
                    cars.remove(c);
                    listModel.removeElementAt(i);
                }
            }
        } 


        writeFile();
    }

我已经指出我的问题在 if 语句中。 (我前后打印了一些东西,试图找到程序所在的位置。'list' 是我的 JList,'listmodel' 是我的默认列表模型。Car 是我创建的包含元素的对象(如 get 方法所示) ). listModel 中显示的元素只是显示 getMake()、getModel() 等的字符串...(每个“get”项之间用大约 10 个空格分隔。)

我在 if 语句中做错了什么?我认为 getMake() 和 getModel() (等等)将是所选索引的子字符串。

非常感谢您的帮助!任何有关我可以使进一步的问题更加具体和清晰的方法的意见将不胜感激!

【问题讨论】:

    标签: if-statement arraylist substring jlist defaultlistmodel


    【解决方案1】:

    您这样做似乎是为了在某种数据结构中找到选定的汽车。你最好做一些事情,比如编写一个可以访问cars 本身的自定义列表模型。然后您可以更立即地检索选择。如果cars 是一个 ArrayList,list 只是与之相似,我也不明白为什么你不能做一些与cars.remove(list.getSelectedIndex()); 相同的事情。或者由于 JList 可以显示任何对象,重写 Car 的 toString 以显示列表当前显示的内容并让列表显示 Cars。然后你可以cars.remove((Car)list.getSelectedValue());

    但除此之外,根据您的描述,您似乎打算以另一种方式进行评估。它是应该包含所有 Car 属性的列表项,而不是包含列表项的所有 Car 属性。所以像

    if( string.contains(c.getMake()) && string.contains(year) // and so on
    

    (或使用 indexOf,但由于 contains 仅返回 indexOf > -1,因此使用 contains 会使您的代码更短。)

    【讨论】:

    • 我喜欢那个 contains() 方法。我将 substring 方法更改为 contains 方法,并且循环实际上通过了。此外,我的比较有一些问题(在 JOptionPane 确认声明中,汽车不匹配,这让我有些困惑)。我改变了它,它工作得很好!非常感谢!!!
    最近更新 更多