我正在寻找一种允许重复并维护插入顺序的数据结构,以便在给定文件输入时:a + a + b = c
因此,一旦正确分割,我将得到:{a,+,a,+,b,=,c}
此数据结构还需要允许以正确的顺序删除和插入,例如,如果我将 a 替换为 d ,我应该{d,+,d,+,b,=,c}
最后,结构还必须能够识别某个项目之前或之后的项目。例如。 = 之前的项目 b ,紧接在 c 之后。
我知道列表允许重复,一些列表维护插入顺序,但我不确定哪个允许我实现目标。
如果您知道上述所有结构,请提供创建此类结构的语法。
此致
答案 0 :(得分:3)
似乎ArrayList
ListIterator
符合您的要求,有关示例用法,请参阅:http://www.java2s.com/Code/Java/Collections-Data-Structure/BidirectionalTraversalwithListIterator.htm
答案 1 :(得分:1)
假设性能足以引起关注,不使用简单的Java List
实现之一(因为您希望避免迭代整个列表以在替换期间搜索项目),那么您需要维护两个数据结构,一个用于跟踪令牌的顺序,另一个用作替换令牌位置的索引。
所以,像(我没有通过编译器运行它,所以期待拼写错误):
class TokenList
{
List<String> tokens;
Map<String,List<Integer>> tokenIndexes= new HashMap<String,List<Integer>>();
TokenList(Iterable<String> tokens)
{
this.tokens = new ArrayList<String>(tokens);
for (int i = 0; i < this.tokens.size(); i++)
{
String token = this.tokens.get(i);
List<Integer> indexes = tokenIndexes.get(token);
if (indexes == null)
{
index = new List<Integer>();
tokenIndexes.put(token, indexes);
}
indexes.add(index);
}
}
void replace(String oldToken, String newToken)
{
List<Integer> indexes = tokenIndexes.remove(oldToken);
if (indexes == null)
throw new IllegalArgumentException("token doesn't exist: " + oldToken);
for (int index : indexes)
tokens.set(i, newToken);
tokenIndexes.put(newToken, indexes);
}
}
这个结构假设一旦创建了令牌就不会改变索引(需要重新创建tokenIndex
映射,这是一个相对昂贵的操作)。