我正在使用swing和awt库用Java编写联系簿应用程序。 Application包含一个JList,它使用TreeSet作为abstractListModel。
TreeSet用于名为Contact的类,它具有专用比较器类,可根据联系人的名字对联系人进行排序。如果联系人具有与O相同的mobileNumber,则private boolean equals(Object o)
方法返回true(当然,在转换之后)。
我想在此应用程序中添加搜索功能。我已经搜索了JTextField并添加了一个keyListener,我想要做的是按下每个键后,列表会显示一组包含搜索词的缩小结果。 TreeSet或任何其他Collection中是否有方法?我希望它与您在iPod中的音乐应用程序中的内容类似,例如,当您键入字母“f”时,它会列出包含字母F的所有歌曲,但只有当您键入“五十分”时才会你想要的歌手出现的歌曲。
感谢您的帮助。
答案 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