我有一个数据读取器,通过给定的分隔符来标记输入字符串。令牌转到ArrayList,分隔符转到另一个。例如:
this + is - an * input
这句话将被标记化,以便“this”,“is”,“an”和“input”将转到令牌数组,而“+”,“ - ”和“*”转到分隔符数组。现在,我需要存储这些的原始索引,以便令牌将具有索引0,2,4和6,并且分隔符将具有索引1,3和5.正常的解决方案是将它们放入相同的数组,但出于性能原因,我需要将它们分开(例如,快速检查分隔符)。
如何进行索引以便当我有一个令牌索引'i'时,我可以轻松地从索引'i + 1'获取deliminator而不循环遍历所有分隔符?
答案 0 :(得分:1)
我建议使用TreeMap
,将索引作为键,将分隔符作为值。它甚至有containsValue()
方法,我认为它可能对你有用。
答案 1 :(得分:0)
尝试将此帖子作为对@Pescis答案的评论,但无法将其格式化。
public class Split {
public static void main(String[] args) {
String in = "this + is - an * input";
StringTokenizer stringTokenizer = new StringTokenizer(in, "+-*", true);
Map<Integer, String> map = new TreeMap<Integer, String>();
int x = stringTokenizer.countTokens();
for (int i = 0; i < x; i++) {
map.put(i, stringTokenizer.nextToken());
}
System.out.println(map);
System.out.println(map.get(0));
System.out.println(map.get(1));
}
}
输出
{0=this , 1=+, 2= is , 3=-, 4= an , 5=*, 6= input}
this
+
答案 2 :(得分:0)
根据您对我的其他答案的评论
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
public static void main(String[] args) {
String in = "this + is - an * input";
Table<Integer, String, String> table = TreeBasedTable.create();
StringTokenizer stringTokenizer = new StringTokenizer(in, "+-*", true);
int x = stringTokenizer.countTokens();
for (int i = 0; i < x / 2; i++) {
table.put(i, stringTokenizer.nextToken(),
stringTokenizer.nextToken());
}
if (stringTokenizer.hasMoreElements()) {
table.put(x, stringTokenizer.nextToken(), "");
}
// iterate through tokens
System.out.println(table.columnKeySet());
// iterate thruogh delims
System.out.println(table.values());
}
具有以下输出
[ an , input, is , this ]
[+, -, *, ]