4

私は、swingライブラリとawtライブラリを使用してJavaでコンタクトブックアプリケーションを作成しています。アプリケーションは、TreeSetをabstractListModelとして使用するJListで構成されています。

TreeSetは、Contactと呼ばれるクラス用であり、名前に基づいて連絡先をソートするプライベートコンパレータクラスがあります。private boolean equals(Object o)ContactがOと同じmobileNumberを持っている場合(もちろんキャスト後)、メソッドはtrueを返します。

このアプリケーションに検索機能を追加したいと思います。JTextFieldを検索し、keyListenerを追加しました。各キーを押すと、検索語を含む結果の絞り込みセットがリストに表示されます。TreeSetまたは他のコレクションにこれを行う方法はありますか?iPodのミュージックアプリケーションにあるものと同じようにしたいと思います。たとえば、文字「f」を入力すると、文字Fを含むすべての曲が一覧表示されますが、「50cent」と入力した場合のみです。あなたが望む歌手の曲が現れること。

ご協力いただきありがとうございます。

4

2 に答える 2

11

テキスト(「f」など)で始まるすべてのエントリを検索する場合は、次のsubSet(from, to)ような方法を使用できます。

SortedSet<String> s = new TreeSet<String>(new Comparator<String>() {
  public int compare( String s1, String s2 ) {
    return s1.compareToIgnoreCase( s2 );
  }

});


s.add( "Erich" );
s.add( "Erica" );
s.add( "Erin" );
s.add( "Dave" );
s.add( "Thomas" );

SortedSet<String> result = s.subSet( "e", "e" + Character.MAX_VALUE ); //"e" represents the user input
System.out.println(result);//prints [Erica, Erich, Erin]

result = s.subSet( "Eric", "Eric" + Character.MAX_VALUE );
System.out.println(result); //prints [Erica, Erich]

result = s.subSet( "Erich", "Erich" + Character.MAX_VALUE );
System.out.println(result); //prints [Erich]

toのtoパラメータsubset(from, to)は排他的であるため、明らかに大きくなるものが必要です。私の例では、単に追加しましCharacter.MAX_VALUEたが、より良い上限を取得したい場合があります。これはコンパレータによって異なることに注意してください。たとえば、大文字と小文字の違いなどを処理する方法などです。

テキストを含むすべてのテキストのように(たとえば、fに変換される*f*)ワイルドカードを使用してフィルタリングする場合は、とにかくすべてのエントリを繰り返して確認する必要があります。その場合、ソートされたセットを使用しても利点はありません。

編集:例をデータに更新しました(私も追加します:))。

于 2011-08-29T09:43:29.293 に答える
1

boolean startsWith(String prefix)クラスのメソッドを使用 java.lang.Stringして、セット内のどの値が入力文字列で始まるかを確認できます。

元 :

public void getName(Set<String> t, String s)
    {
        for(String str : t) 
        {
            if(str.toLowerCase().startsWith(s.toLowerCase()))
                System.out.println(str);
        }
    }

入力:

Set<String> test = new TreeSet<String>();

        test.add( "Erich" );
        test.add( "Erica" );
        test.add( "Erin" );
        test.add( "Dave" );
        test.add( "Thomas" );

メソッドを呼び出す場合:

getName(test, "eri");

出力は次のようになります:

Erica
Erich
Erin
于 2011-08-29T11:02:05.730 に答える