如何在java中标记字符串数组?
我想创建一个字符串数组并将它们标记为:
m funny
s funny
t boring
k boring
然后,如果用户可以通过标记
来搜索它们search : funny
::
m,s
答案 0 :(得分:5)
// key is tag, value all the strings which have this tag.
HashMap<String, HashSet<String>> tags = new HashMap<String, HashSet<String>>();
// words that with the tag: funny
Set<String> words = tags.get("funny");
如果一个单词可以有多个标签,那么您可能有另一个地图:
// key is string, value all the tags for the string
HashMap<String, HashSet<String>> invertedTags = new HashMap<String, HashSet<String>>();
// tags of the word: "m"
Set<String> tags = invertedTags.get("m");
答案 1 :(得分:4)
我建议在字符串中使用Guava MultiMap个标签。这样,您可以通过单个查找获得具有给定标记的所有字符串。
MultiMap<String, String> tagStringMap = new MultiMap<String, String>();
// load up the tag to strings.
tagStringMap.put(tag1, string1);
// single lookup gets everything.
Collection<String> strings = tagStringMap.get(tag);
答案 2 :(得分:2)
创建HashMap
以存储正向和反向映射。
HashMap<String,String> stringTags;
HashMap<String,ArrayList<String>> tagStrings;
然后你可以像这样添加映射:
public void tagString(String string, String tag) {
this.stringTags.put(string, tag);
ArrayList<String> strings = this.tagStrings.get(tag);
if (strings == null) {
strings = new ArrayList<String>();
this.tagStrings.put(tag, strings);
}
strings.add(string);
}
然后您可以这样访问:
private String getTag(String string) {
return this.stringTags.get(string);
}
private String[] getStrings(String tag) {
ArrayList<String> strings = this.tagStrings.get(tag);
if (strings == null)
return new String[0];
return strings.toArray(new String[strings.size()]);
}
如果多个线程将访问此数据,请记住同步这些函数。
答案 3 :(得分:1)
使用Map
。
import java.util.*;
public class TestTaggedStrings {
Map<String, String> taggedStrings = new HashMap<String, String>();
public TestTaggedStrings() {
taggedStrings.put("m", "funny");
taggedStrings.put("s", "funny");
taggedStrings.put("t", "boring");
taggedStrings.put("k", "boring");
}
public static void main(String[] args) {
TestTaggedStrings testStrings = new TestTaggedStrings();
System.out.println(testStrings.search("funny"));
}
public List<String> search(String searchTerm) {
List<String> matches = new ArrayList<String>();
Set<String> keys = taggedStrings.keySet();
for(String key : keys) {
if(searchTerm.equals(taggedStrings.get(key))) {
matches.add(key);
}
}
return matches;
}
}
测试:
$>javac TestTaggedStrings.java
$>java TestTaggedStrings
[s, m]