【问题标题】:Structure that allows duplicates, maintains insertion order and allows removal and insertion允许重复、维护插入顺序并允许删除和插入的结构
【发布时间】:2013-01-06 19:58:25
【问题描述】:

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

这样一旦正确拆分,我会得到:{a,+,a,+,b,=,c}

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

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

我知道列表允许重复,并且一些列表保持插入顺序,但我不确定哪个可以实现我的目标。

如果您知道可以实现上述所有功能的结构,请提供创建此类结构的语法。

问候

【问题讨论】:

  • 还没试过。从来不知道有这样的东西存在。它能做我想做的一切吗?
  • 我认为你需要一个平衡的树形数据结构。
  • 我绝对可以使用“分支因子”是否有指向您可以提供给我的示例的链接,以及创建这种结构的语法是什么?
  • 有一些基本的实现是可用的-link 1link 2,但是你必须扩展你需要的更多。

标签: java list replace duplicates insertion


【解决方案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 映射需要重新创建,这是一个相对昂贵的操作)。

【讨论】:

  • 已经尝试过了。需要有重复的键。将重新考虑这个选项
  • 我不确定我理解你的意思。这可以处理输入列表中标记/键的多个实例。
【解决方案2】:

似乎ArrayListListIterator 可以满足您的要求,有关示例用法,请参阅:http://www.java2s.com/Code/Java/Collections-Data-Structure/BidirectionalTraversalwithListIterator.htm

【讨论】:

  • 我的文件输入并不总是相同的,所以我必须删除的项目并不总是相同的顺序,所以我不确定是否遍历数据是最佳选择。理想情况下,我想说 if(list.contains("a"){ replace a with d} 以获得我在问题中展示的输出。
  • 听起来您的问题是提出算法而不是找到合适的数据结构。带有ListIteratorList 实现应该满足您声明的要求。如果没有,您应该更新问题。
  • 只是在寻找一种可以存储重复项并保持插入顺序的数据结构。我之前使用过 arrayList,因为我的文件输入变化很大,我所能做的就是替换值,但这些值一直被放在列表的末尾。如果输入差异很大,是否可以使用 listIterator 执行我在问题中解释的内容?
  • 那么 List 就是你的结构。您可以使用Collections 替换东西:Collections.replaceAll(myArray, 'a', 'd')
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 2012-03-15
  • 2012-02-03
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多