【问题标题】:String into integer array without second array将字符串转换为没有第二个数组的整数数组
【发布时间】:2012-05-24 23:27:00
【问题描述】:

我有一个字符串作为输入,它是一组数字,它们之间有空格,例如:

"30 129 48 29 110 90"

我想要做的是获取该字符串并将其作为整数输入到数组中,而无需首先使用第二个数组将数字存储为字符串。这就是我知道该怎么做:

String line = input.nextLine();
String[] arr = line.split(" ");
int[] array = new int[arr.length];


for (int i = 0; i < arr.length; i++){
    array[i] = Integer.parseInt(arr[i]);
}

我不想制作 2 个数组来完成这项工作,但以某种方式在 for 循环中一次完成,我只是想要这样,因为它对我的眼睛更好,而且我喜欢编写干净的代码稍后我可以轻松更正。

编辑:在 jogabonito 的回答之后,这就是我设法做的事情

Scanner input = new Scanner(System.in);

    System.out.printf("Input: ");

    StringTokenizer line = new StringTokenizer(input.nextLine());
    int[] numbers = new int[line.countTokens()];


    for (int i = 0; line.hasMoreTokens(); i++){
        numbers[i] = Integer.parseInt((String)line.nextElement());
    }

【问题讨论】:

  • 我不确定我是否遵循您的推理。避免使用辅助数组很可能会导致代码的可读性低于
  • 只是使用两个数组来做一件简单的事情对我来说不太合适,我想要一些可以立即转换 for 循环中的每个数字而不必依赖第二个数组
  • 请注意,您将使用额外的数组或分析字符串两次:第一次只是为了计算数字,第二次是填充您的数组。
  • 你可以使用indexOf()substring() 等等,但是这样的代码看起来会很乱。它会在一个循环中用一个数组完成。
  • @Gaim 在开始填充int 数组之前,OP 将如何获取数字计数?这是impossiburu

标签: java arrays split java.util.scanner


【解决方案1】:

您当前的方法很好,但如果您希望您“可以”使用StringTokenizer 执行此操作。 创建一个大小由countElements() 确定的 int[],然后在 while 循环中执行 Integer.parseInt(tokenizer.nextElement())

测试代码:

    String input = "30 129 48 29 110 90";
    StringTokenizer tokenizer = new StringTokenizer(input);
    int count = tokenizer.countTokens();
    int x[] = new int[count];
    int i=0;
    while (tokenizer.hasMoreElements()) {
        x[i++] = Integer.parseInt((String)tokenizer.nextElement());
    }

【讨论】:

  • +1:我认为这是API与OP要求的最佳匹配。它将给出好看的代码并实现他的目标。它不会避免两次扫描字符串,但这是 OP 的调用。
  • 我正在实现这个,但使用了一些不同的方法,因为我想避免使用 while 循环,因为声明了 int i = 0 (是的,我对代码越来越偏执,但是我真的很接近用 for 循环来实现它:P)。最后我不认为它适用于 for 循环..
  • @SilliconTouch for (int i=0; tokenizer.hasMoreTokens(); i++) x[i] = Integer.parseInt(tokenizer.nextToken()); 而你并不真的需要 count 作为 var,内联它。您还可以编写最直接的 for 循环,检查 x.length。那样不会有什么问题。
  • 我相信我设法实现了你所说的,请查看我帖子中的编辑
【解决方案2】:

您可以使用Scanner:

Scanner sc = new Scanner(System.in);
while sc.hasNextInt()
   int i = sc.nextInt();

我不知道它是否更具可读性,或者即使它具有更好的性能。但这肯定是另一种方式。而且您无法事先知道有多少个整数,因此您需要使用一个列表。

【讨论】:

  • 为了使其与 OP 的代码相媲美,别忘了还要实现生成 int[] 数组的逻辑!
  • @aix 当然,这就是问题所在——他数不清!
  • 是的,我试过了,问题是字符串以按 enter 结束,这个解决方案不适用于该解决方案,但我通过在字符串中创建扫描仪找到了一个实现,但在我需要它在一个数组而不是一个列表中
  • @SilliconTouch:IMO 你想多了。
  • @aix 有时候想得太多是好的——作为一个学习过程。
【解决方案3】:

您确定要使用数组而不是 Collection

我的想法是这样的

String input = "30 129 48 29 110 90";
List<Integer> list = new ArrayList<Integer>();

for (String token: input.split(" ")) {
    list.add( Integer.valueOf( token ) );
}

您当然可以将列表转换为数组:

Integer[] array = list.toArray( new Integer[] {} );

【讨论】:

    【解决方案4】:

    我只是想要这样,因为它对我的眼睛更好,我喜欢编写干净的代码,以后我可以很容易地更正。

    在这种情况下,不要改变任何事情。你所拥有的可能是可读的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-08
      • 2019-04-21
      相关资源
      最近更新 更多