允许重复,维护插入顺序并允许删除和插入的结构

时间:2013-01-23 10:58:21

标签: java list replace duplicates insertion

我正在寻找一种允许重复并维护插入顺序的数据结构,以便在给定文件输入时:a + a + b = c

因此,一旦正确分割,我将得到:{a,+,a,+,b,=,c}

此数据结构还需要允许以正确的顺序删除和插入,例如,如果我将 a 替换为 d ,我应该{d,+,d,+,b,=,c}

最后,结构还必须能够识别某个项目之前或之后的项目。例如。 = 之前的项目 b ,紧接在 c 之后。

我知道列表允许重复,一些列表维护插入顺序,但我不确定哪个允许我实现目标。

如果您知道上述所有结构,请提供创建此类结构的语法。

此致

2 个答案:

答案 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映射,这是一个相对昂贵的操作)。