4

我正在使用 swing 和 awt 库在 Java 中编写通讯录应用程序。该应用程序由一个使用 TreeSet 作为 abstractListModel 的 JList 组成。

TreeSet 用于名为 Contact 的类,该类具有私有比较器类,可根据联系人的名字对联系人进行排序。private boolean equals(Object o)如果 Contact 具有与 O 相同的 mobileNumber(当然是在转换之后),则该方法返回 true。

我想在此应用程序中添加搜索功能。我进行了搜索 JTextField 并添加了一个 keyListener ,我想要做的是在按下每个键后,列表会显示一组包含搜索词的缩小结果。在 TreeSet 或任何其他集合中是否有此方法?我希望它类似于您在 iPod 中的音乐应用程序中的内容,例如,当您键入字母“f”时,它会列出所有包含字母 F 的歌曲,但仅在您键入“50 cent”时出现您想要的歌手的歌曲。

谢谢你的帮助。

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参数 tosubset(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 回答