【问题标题】:Retrieve string from list if we know the index如果我们知道索引,则从列表中检索字符串
【发布时间】:2012-01-11 08:26:35
【问题描述】:

如果我们知道要检索的字符串的索引,有没有办法从 ArrayList 中检索字符串?例如在这个字符串中:

String text2 = "if(AGE_Y>15){\r\n"
                + "x=PROPERTY_LENGTH;\r\n"
                + "}";

此字符串添加到的列表如下所示:if, (, AGE_Y, >, 15, ), {, ...

现在,如果我们遍历列表并将每个项目添加到 StringBuilder 并为每个项目定义索引:

for (int i = 0; i < list.size(); i++)
{
   a=list.get(i);
   strBuilder.append(a); 
   index = strBuilder.length() - a.length();
}

例如,我们将确切知道字符串“PROPERTY_LENGTH”在哪个索引处。

我的问题是,我们如何从列表中检索字符串“x”?我问是因为在“x”上方的行(或将命名该变量的任何内容)我想在 StringBuilder 中插入其他内容。通常我们可以这样做:

 String previous=list.get(indexOfPropertyLength-2);
 strBuilder.insert(index-previous.length-1,"string to insert");

这可能吗?

【问题讨论】:

  • 您希望通过列表处理此问题的任何原因?我猜你可以使用正则表达式做你想做的事(用前缀和 x=PROPERTY_LENGTH 替换 x=PROPERTY_LENGTH)......如果你需要,你也可以提取 PROPERTY_LENGTH 的值,这只是一个占位符。
  • @aishwarya:我选择了一个列表,因为您在那里看到的 AGE_Y 和 PROPERTY_LENGTH 只是在这种情况下使用的大约 1000 多个可能(我称之为参考)中的两个,而我没有认为正则表达式适合那个(虽然可能是错误的)。
  • 那么它是 ArrayList 还是 StringBuilder?
  • @DanielV,当然。我可能仍然建议使用正则表达式(并使用逻辑 or 操作,即 | 来连接引用并构建正则表达式)。我个人觉得在操作字符串时使用索引很棘手,所以尽量避免它。

标签: java


【解决方案1】:

首先,您可以重写列表迭代以更有效地工作:

for (int i = 0; i < list.size(); i++) {
    a=list.get(i);
    index = strBuilder.length(); // (you don't have to calculate an index)
    strBuilder.append(a); 
}

要解决您的问题的标题,如果您只想在给定索引的列表中找到一个字符串,您当然可以使用myList.get(myIntIndex);。但是,您似乎在问如何找到给定字符串的索引:myList.indexOf(myString) 或类似的东西。如果你能更清楚一点,我们可能会提供更多帮助。您正在编写混合汇编器或编译器吗?

【讨论】:

  • 这是一种编译器。说“有点”是因为它远没有那么复杂,但基本思想大致相同。感谢您提出重写该循环的建议。关于“myList.get(myIntIndex)”,我检索索引的方式使其无法做到这一点,因为在某个点之后,索引的值将始终大于列表的 size()
  • 汇编器编写起来很棘手(编译器更是如此),但它们采用类似的策略来组织输入。我鼓励您尝试使用“查找表”,例如 Java 中的 Hashtable,您可以使用它来存储任何常量或变量(例如 PROPERTY_LENGTH 等)的名称和位置。并在需要时轻松地从该表中引用它们。在处理输入代码时修改输入代码可能不是一个好主意,因为它可能会干扰表中的引用以及其他此类问题。
  • 如果您有兴趣了解有关常见编译器和汇编器设计策略的更多信息,如果可以,您绝对应该查看 Leland Beck 的“系统软件:系统编程简介”,找到 here .
  • 谢谢,我很可能会明白的 :)
  • 关于您的索引值变得大于列表的大小,将变量存储在查找表中而不是在找到变量时修改输入代码可以防止您的索引混乱。如果您想让事情变得简单,请将您的编译器设置为“多遍编译器”,在该编译器中它会多次扫描您的整个输入代码。第一遍可能会在查找表中收集变量名称和位置。第二遍可能会将输入代码中的变量替换为其等效值等。
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多