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
可以满足您的要求,有关示例用法,请参阅:假设性能足够值得关注,为了不使用一个简单的JavaList
实现(因为您希望避免在替换过程中迭代整个列表来搜索项目),您需要维护两个数据结构,一个用于跟踪令牌顺序,另一个作为替换令牌位置的索引
比如(我还没有通过编译器运行过这个,所以应该是打字错误):
类标记列表
{
列出代币;
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);
}
}