即时搜索TreeSet中的记录

W.K*_*K.S 4 java search treeset

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

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

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

谢谢你的帮助.

Tho*_*mas 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]
Run Code Online (Sandbox Code Playgroud)

由于to参数subset(from, to)为独占,因此您需要的东西显然会更大.在我的例子中,我只是添加了Character.MAX_VALUE但你可能想要获得更好的上限.请注意,这取决于您的比较器,例如它如何处理案例差异等.

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

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