即时搜索TreeSet中的记录

时间:2011-08-29 09:28:59

标签: java search treeset

我正在使用swing和awt库用Java编写联系簿应用程序。 Application包含一个JList,它使用TreeSet作为abstractListModel。

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分: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的{​​{1}}参数是独占的,因此您需要的东西显然会更大。在我的示例中,我只是添加了subset(from, to),但您可能希望获得更好的上限。请注意,这取决于您的比较器,例如它如何处理案件差异等。

如果您想使用通配符进行过滤,例如所有文本包含文本(例如Character.MAX_VALUE将转换为f),您必须迭代并检查无论如何所有的条目。在这种情况下,使用有序集合没有任何好处。

编辑:将示例更新为您的数据(同时添加我:))。

答案 1 :(得分: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