Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 允许复制、保持插入顺序并允许删除和插入的结构_Java_List_Replace_Duplicates_Insertion - Fatal编程技术网

Java 允许复制、保持插入顺序并允许删除和插入的结构

Java 允许复制、保持插入顺序并允许删除和插入的结构,java,list,replace,duplicates,insertion,Java,List,Replace,Duplicates,Insertion,我正在寻找一种数据结构,它允许复制并保持插入顺序,以便在给定文件输入时:a+a+b=c 因此,一旦正确拆分,我将得到:{a,+,a,+,b,=,c} 此数据结构还需要允许以正确的顺序删除和插入,例如,如果我将a替换为d,我应该得到{d,+,d,+,b,=,c} 最后,结构还必须能够识别哪些项目在某个项目之前或之后。例如,=前面的项目是b,后面的项目是c 我知道列表允许重复,有些列表保持插入顺序,但我不确定哪一个可以让我实现目标 如果您知道一个结构将实现上述所有功能,请提供创建此类结构的语法 关于

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

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

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

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

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

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


关于似乎
ArrayList
ListIterator
可以满足您的要求,有关示例用法,请参阅:

似乎
ArrayList
ListIterator
可以满足您的要求,有关示例用法,请参阅:

假设性能足够值得关注,为了不使用一个简单的Java
List
实现(因为您希望避免在替换过程中迭代整个列表来搜索项目),您需要维护两个数据结构,一个用于跟踪令牌顺序,另一个作为替换令牌位置的索引

比如(我还没有通过编译器运行过这个,所以应该是打字错误):

类标记列表
{
列出代币;
Map tokenindex=newhashmap();
令牌列表(Iterable令牌)
{
this.tokens=新的ArrayList(tokens);
for(int i=0;i

此结构假设令牌在创建后不会更改索引(需要重新创建
令牌索引
映射,这是一个相对昂贵的操作)。

假设性能足够令人担忧,不使用简单的Java
列表
实现(因为您希望避免在替换期间迭代整个列表以搜索项目),因此您需要维护两个数据结构,一个用于跟踪令牌的顺序,另一个作为替换令牌位置的索引

比如(我还没有通过编译器运行过这个,所以应该是打字错误):

类标记列表
{
列出代币;
Map tokenindex=newhashmap();
令牌列表(Iterable令牌)
{
this.tokens=新的ArrayList(tokens);
for(int i=0;i

此结构假设令牌在创建后不会更改索引(需要重新创建
tokenIndex
map,这是一个相对昂贵的操作).

还没有尝试过。我从来不知道有这样的东西。它能做我想要的一切吗?我想你需要一个平衡的树数据结构。我肯定可以使用“分支因子”你能给我提供一个例子的链接吗?创建这样一个结构的语法是什么?有一些基本的实现是可用的,但你必须扩展你需要的更多。还没有尝试过。从来都不知道有这样的东西存在。它能做我想要的一切吗?我想你需要一个平衡的树数据结构。我可以一定要使用“分支因子”你能给我提供一个例子的链接吗?创建这样一个结构的语法是什么?有一些基本的实现是可用的,但你必须扩展你需要的更多。我的文件输入并不总是相同的,所以我必须删除的项不总是以相同的顺序,所以我不确定是否迭代thr虽然数据是最好的选择。理想情况下,我想说如果(list.contains(“a”){用d替换a}获取我在问题中演示的输出。听起来你的问题是提出一个算法,而不是找到一个合适的数据结构。使用
列表迭代器
实现的
列表应该满足你的要求。如果没有,你应该更新问题。我只是在寻找一个可以d存储重复项并保持插入顺序。我以前使用过arrayList,因为我的文件输入变化很大,所以我所能做的就是替换值,但这些值一直放在列表的末尾。如果输入变化很大,是否可以使用listIterator执行我在问题中解释的操作?然后
list
是您的结构。您可以使用
集合
替换内容:
集合.replaceAll(myArray,'a','d')
。我的文件输入并不总是
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);
  }
}