0

私の質問に対して十分な背景情報を提供していない場合は、あらかじめご容赦ください。長年の読者、初めての質問者。

タブ区切りの .txt ファイルを介してアクセスされる車のデータベースを持つプログラムを作成しています (最近、プログラミング クラスでこのようなことを行ったので、それを拡張したいと思いました)。

ターミナル ウィンドウを使用する代わりに、この形式では Car オブジェクト (メーカー、モデル、年、価格などを含む) を ArrayList に表示しています。Car オブジェクトの配列を使用しているため、JFrame、JList、および ListModel を使用しています。

私のプログラムでは、ユーザーがデータベースからアイテムを削除できる削除メソッドを作成したいと考えていました。最初に、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() (など) は、選択したインデックスの部分文字列になると考えました。

ご協力ありがとうございました!さらなる質問をより具体的かつ明確にする方法に関するご意見をいただければ幸いです。

4

1 に答える 1

0

ある種のデータ構造で選択した車を見つけるためにこれを行っているようです。それ自体にアクセスできるカスタム リスト モデルをプログラミングするようなことをしたほうがよいでしょう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

(または indexOfindexOf > -1を使用しますが、 contains は単に return であるため、contains を使用するとコードが多少短くなります。)

于 2013-12-25T21:39:20.267 に答える