当前位置: 首页 > 面试题库 >

在TreeSet中即时搜索记录

叶裕
2023-03-14
问题内容

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

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

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

谢谢你的帮助。


问题答案:

如果要查找所有以文本开头的条目(例如“ 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]

由于toto 的参数subset(from, to)是排他的,因此您需要的东西显然会更大。在我的示例中,我只是添加了一个,Character.MAX_VALUE但是您可能希望获得更好的上限。请注意,这取决于您的比较器,例如,它如何处理大小写差异等。

如果您想使用通配符进行过滤,例如 包含
该文本的所有文本(例如,f将转换为*f*),则必须遍历并检查所有条目。在这种情况下,使用排序集不会获得任何好处。

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



 类似资料:
  • 问题内容: 我需要搜索CSV格式文件中的PB级数据。使用LUCENE进行索引后,索引文件的大​​小是原始文件的两倍。是否可以减少索引文件的大​​小???如何在HADOOP中分发LUCENE索引文件以及如何在搜索环境中使用?还是有必要,我应该使用solr来分配LUCENE索引吗???我的要求是对PB级文件进行即时搜索。 问题答案: 任何现成的搜索引擎(如Lucene)都应该能够在您拥有的数据量范围内

  • 问题内容: 我有一个似乎无法解决的性能问题。我有一个即时搜索功能,但是有点麻烦,因为它开始在每个位置上搜索。 JS: HTML: JSON数据甚至没有那么大,只有300KB,我认为我需要完成的是在搜索上放置〜1秒的延迟,以等待用户完成键入操作,而不是对每个按键执行操作。AngularJS在内部执行此操作,在阅读了文档和此处的其他主题之后,我找不到特定的答案。 我将不胜感激如何延迟即时搜索的任何指示

  • 我正在编写一个。NET应用程序,它应该读取一个大约200页长的。docx文件(通常是documentformat.openxml2.5),以查找文档应该包含的某些标记的所有出现情况。明确地说,我不是在寻找OpenXML标记,而是应该由文档编写器设置到文档中的标记,作为在第二阶段需要填充的值的占位符。此类标记应采用以下格式: (其中TAG可以是任意字符序列)。正如我所说的,我必须找到这类标签的所有出

  • 问题内容: 我在post_content列中有html内容。 我想搜索A并将其替换为B,但只有A第一次出现在记录中,因为它可能出现多次。 以下查询显然会将A的所有实例替换为B 问题答案: 这实际上应该是您在MySQL中想要的: 它比我之前的答案稍微复杂- 您需要找到’A’的第一个实例(使用INSTR函数),然后结合使用LEFT和REPLACE来替换该实例,而不是使用SUBSTRING和INSTR来

  • 在测试此文本时,我在要在文本中搜索的列上创建了lucene(3.0.1)索引: 如果我按关键字搜索,它会给出结果,但按 我正在使用standardAnalyzer: 因为已设置,它应创建令牌,并且应存在$GLD。Analyzer将从文本中删除停止字,因为word也将在该过程中删除。

  • 给定二叉查找树(BST)和整数val的根。 在BST中找到该节点的值等于val的节点,并返回以该节点为根的子树。如果这样的节点不存在,则返回null。 为什么'ans=root'不起作用??