【问题标题】:Split first string from other strings从其他字符串中拆分第一个字符串
【发布时间】:2015-03-13 04:02:24
【问题描述】:

我有一个字符串“1 2 3 4 5”..,我想将字符串拆分为 stringA“1”和 stringB“2 3 4 5”.. 我知道 string.split("\\ ", 1) 返回一个数组,但我有一个用户定义的字符串数量,所以我不想为每个要拆分的字符串创建一个新数组,然后获取数组的第一个字符串。

我对 Java 还很陌生,所以也许更深入的解释/解释的链接会很好:)

关于用户定义的编辑:我有一个字符串“输入”,它被 \\\n 拆分,然后将结果放入字符串“麦芽汁”的 ArrayList 中。

我现在想将 'wort' 的每个条目进一步拆分为两个新的 ArrayList 'wortFirst' 和 'wortRemaining'。

所有这些都是因为我正在编写一个词汇助手。它显示 wortFirst 和按下解决方案按钮 wortFirst 在 wortRemaining 中的对应项。我计划通过一个 int i 来做到这一点,这对于 wortFirst(.get(i)) 和 wortRemaining(.get(i)) 都是一样的

【问题讨论】:

  • 多少个用户自定义的字符串?请添加更多详细信息
  • 因为如果是我,我会给你 string.Split() 并将结果存储在字符串数组列表中
  • "但是我有一个用户定义的字符串数量,所以我不想为每个字符串创建一个新数组"你能给我们举个用户和数据的例子吗?你希望你的程序如何处理它?
  • 我从星期六开始编程,请原谅我的无能提出问题:)
  • 所以每一行都是keyWord rest of line的形式。我们可以假设每个keyWord 都是唯一的吗?同样,在拆分此行之后,您是要保留输入顺序,还是要对数据进行排序?最后一个问题,你可以使用Map(这将创建一对keyWord -> rest of line)吗?这不会让您轻松使用get(i),但您将能够使用get(keyWord) 访问rest of line。您还可以访问所有条目的集合(所有键-> 值对放在地图中)并在需要时对其进行迭代。

标签: java arrays string


【解决方案1】:

看起来您正在尝试创建会拆分的字典

keyWord rest of the line

进入keyWordrest of the line

假设我有 input.txt 文件,我的应用可以读取该文件,其内容看起来像

foo description of foo
bar very long description of bar

将其放入地图的代码如下所示:

//I will fill my list with lines from file
List<String> lines = Files.readAllLines(Paths.get("input.txt"));

Map<String, String> dictionary = new LinkedHashMap<>();
                                //   LinkedHashMap - preserves order of insertion
                                //   if you don't need to preserve it use HashMap
                                //   if you want to sort elements by value of key 
                                //   use TreeMap

//lets split each line to key and value like you already do
//and put it into dictionary
for (String line : lines){
    String[] tokens = line.split("\\s+",2); //split on one (or more continues whitespaces)
                                            //but limit size of array to 2
    dictionary.put(tokens[0], tokens[1]);   //I assume "rest of the line" is mandatory, 
                                            //otherwise tokens[1] will not exist
}

您可以通过迭代其条目集(所有键值对)来打印生成映射的内容:

//lets print content of map
for (Map.Entry<String, String> pair : dictionary.entrySet()){
    System.out.println(pair.getKey()+" -> "+pair.getValue());
}

现在要从地图中获取单个元素,我们可以使用get(key),如果地图中不存在键将返回null,所以如果你想避免null,你可以使用getOrDefault(key, alternativeValue),如果@ 987654334@ 将不存在地图将返回alternativeValue

String definition = dictionary.get("foo");
//if you want to return some predefined value in case "foo" will not be 
//present in dictionary you can use:
//String definition = dictionary.getOrDefault("foo","--there is no such word in dictionary--");
System.out.println("definition for key \"foo\" is: "+definition);

输出:

foo -> description of foo
bar -> very long description of bar
definition for key "foo" is: description of foo

要运行此示例,您将需要这些类

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

您的 IDE 应该能够为您生成此导入(在 Eclipse 中使用 Ctrl+Shift+O


更新:

不幸的是Map 没有get(index) 方法。但是,当您使用键值对填充数组时,您可以创建 Map.Entry 元素中的 List,这些元素具有 sizeget 方法。为此,您可以简单地使用复制构造函数,例如

Random r = new Random();

List<Map.Entry<String, String>> allPairs = new ArrayList<>(dictionary.entrySet());
// list will be filled with content from this set          ^^^^^^^^^^^^^^^^^^^^^ 
int randomIndex = r.nextInt(allPairs.size());
Map.Entry<String, String> randomEntry = allPairs.get(randomIndex);
System.out.println(randomEntry.getKey());
System.out.println(randomEntry.getValue());

【讨论】:

  • 太棒了!对我来说几乎完美,我的问题是我想检索字典的随机键,就像我可以使用 ArrayList (arraylist.get(i), i 是随机的) 一样,使用 Map 也可以吗?还是非常感谢你:)
  • @Skilly 此外,由于您在 Stack Overflow 上相对较新,您可能还不知道接受应答机制。在这种情况下,请考虑阅读meta.stackexchange.com/a/5235/186652。如果您喜欢某个答案解决了您的问题,请考虑接受它。
  • 对不起,我不太明白。那有什么作用?每次我运行这部分代码时,randomEntry.getKey() 和 .getValue() 是否不同?这可能不会很有用,但无论如何这里是我的程序的源代码:pastebin.com/tyz49bKA
  • @Skilly 我不确定是什么让你感到困惑。在此答案下的第一条评论中,您说“我想检索字典的随机键”。 “更新”部分中的代码显示了如何将映射(字典)中的所有键值对存储在列表 new ArrayList&lt;&gt;(dictionary.entrySet()) 中。我还添加了如何在[0, numberOfPairs) - r.nextInt(allPairs.size()) 范围内随机索引的示例。现在基于该随机索引,我能够从列表中获取键值对(条目)。然后我只需使用 randomEntry.getKey()randomEntry.getValue() 从挑选的对中打印键和值。
  • 没关系,我想通了。感谢您帮助我制作地图等!我的程序现在按预期工作:)
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2022-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多