数组拆分似乎不起作用,并且拒绝填充地图和列表

时间:2017-06-12 10:48:29

标签: java arrays string arraylist maps

有人可以告诉我这段代码有什么问题。

我要做的是创建一个电话簿,它将接收第一个输入作为用户想要输入的条目数量,随后的输入将是电话簿详细信息的输入 长串的形式。

它将包括人名和电话号码,在一行中,然后在输入后,我将输入的值分成两个,并将每个作为键和值存储在地图中。

但我的代码无效。

我在列表中做的是:

来自stdin的输入将是单个输入行中的名称和电话号码的单个字符串。所以我要做的是将长串的名称和数字分成两个(名称和数字),并将它们存储在列表中,然后当我想填充Map时,我将调用列表的索引数字所在的位置并将其用作值,并调用名称所在列表的索引并将其用作Map中的键。

我尝试过使用数组,但拆分字符串时会出现问题。现在使用此列表,分割的字符串似乎不会保存在列表中,可能是因为循环的迭代。

洞察力将有所帮助

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Testube {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int phoneBookSize = sc.nextInt();
        String[] names = new String[phoneBookSize];
        String[] numbers = new String[phoneBookSize];
        Map<String, String> phoneBook = new LinkedHashMap<>();
        String[] inputNameAndNumber = new String[2];
        String name;
        String number;
        List<String> keepStrings = new ArrayList<String>();
        for (int i = 0; i < phoneBookSize; i++) {

            for (int j = 0; j < 2; j++) {
                inputNameAndNumber = sc.next().split(" ");

                String holder = inputNameAndNumber[j];
                keepStrings.add(holder);
                // name = inputNameAndNumber[0];
                // number = inputNameAndNumber [1];

            }
            phoneBook.put(keepStrings.get(0), keepStrings.get(1));


        }
        System.out.println(phoneBook.entrySet());
    }

2 个答案:

答案 0 :(得分:0)

您应该删除j循环。它允许您输入您的姓名和号码两次以正常工作,因为sc.next()在此循环中。

第二点是您的电话簿只包含一个条目,因为您始终使用相同的值。这是因为您的列表永远不会被清除。

您可以将循环更改为:

// consume 'new line' after sc.nextInt()
sc.nextLine();
for (int i = 0; i < phoneBookSize; i++) {
    // note: change `next` to `nextLine`
    inputNameAndNumber = sc.nextLine().split(" ");
    name = inputNameAndNumber[0];
    number = inputNameAndNumber[1];
    phoneBook.put(name, number);
}

因此,在每次迭代中填充电话簿时,您需要在下一次输入时更改namenumber

您的输入同时包含名称和数字,如

Alex 123
Ben 456
Ed 789

答案 1 :(得分:0)

需要重新实例化或清除列表for (int i = 0; i < phoneBookSize; i++) { for (int j = 0; j < 2; j++) { inputNameAndNumber = sc.next().split(" "); String holder = inputNameAndNumber[j]; keepStrings.add(holder); // name = inputNameAndNumber[0]; // number = inputNameAndNumber [1]; } phoneBook.put(keepStrings.get(0), keepStrings.get(1)); keepStrings.clear(); } ,否则对象将继续堆积在其他索引中。该列表将保持其状态(在索引后面的更多对象),即索引0和1上的对象将相同,直到被清除或重新实例化。

for (int i = 0; i < phoneBookSize; i++) {

                for (int j = 0; j < 2; j++) {

                    keepStrings = new ArrayList<String>();
                    inputNameAndNumber = sc.next().split(" ");

                    String holder = inputNameAndNumber[j];
                    keepStrings.add(holder);
                    // name = inputNameAndNumber[0];
                    // number = inputNameAndNumber [1];

                }
                phoneBook.put(keepStrings.get(0), keepStrings.get(1));

            }

OR

@import "_variables";
@import "_mixins";
@import "_grid";

虽然第一个解决方案在这里更好用。