Java将元素拆分并添加到相应的数据类型arraylists中

时间:2015-11-25 15:33:18

标签: java arraylist split

我的问题是当用户输入文本时,在使用.split()时应该有两个要分割的元素,但是如果它分割的项目如何将它们放入不同的列表中,以便我可以使用基于整数的列表进行计算。

e.g。 用户输入" skyrim,100" '天际' entry是一个字符串但是数字(整数)' 100'我想拆分它,删除逗号并将其添加到ArrayList进行计算并添加其他输入。

游戏名称(字符串),小时(整数)< - 模板

  1. 天际,100
  2. 遗忘,25
  3. GTA V,50
  4. 所以上面列出的项目是用户输入,其中2个参数用逗号分隔,将被拆分,然后我需要将它们添加到不同的arraylists。

    Scanner input = new Scanner(System.in);
    
    Arraylist<String> game = new Arraylist<>();
    Arraylist<Integer> hours = new Arraylist<>();
    Arraylist<Object> allGameData = new Arraylist<>();
    
    String gameEntry = input.nextLine().split(" , ");
    
    allGameData.add(gameEntry);
    
    foreach(object items : allGameData) { 
    System.out.println(items);
    }
    

    所以从这里我应该:

    天空,100,遗忘,25,GTAV,50

    如何将游戏名称放入游戏列表,将数字放入小时列表?

3 个答案:

答案 0 :(得分:1)

对于初学者来说,你应该使用的课程是ArrayList,大写 L 。所以你需要改变:

Arraylist<String> game = new Arraylist<>();
Arraylist<Integer> hours = new Arraylist<>();
Arraylist<Object> allGameData = new Arraylist<>();

到此:

ArrayList<String> game = new ArrayList<>();
ArrayList<Integer> hours = new ArrayList<>();
ArrayList<Object> allGameData = new ArrayList<>();

在我们正确初始化它们之后,我们使用ArrayList添加到#.add,因此在您的情况下,您会添加到gamehours列表中,如:

game.add("some game");
hours.add(10);

当您使用input.nextLine().split(" , ");分割输入时,我们期望返回一个String数组。目前您正在尝试将其设置为String而不是String数组。

while (true){
    System.out.println("Enter \"game , hours\" or \"Quit\"");
    String line = input.nextLine();
    if (line.equals("Quit")) break;
    allGameData.add(line);
    String[] parsedData = line.split(" , ");
    game.add(parsedData[0]);
    hours.add(Integer.parseInt(parsedData[1]));
}

答案 1 :(得分:0)

您可以使用Integer.parseInt()。您提交的代码看起来是伪代码的,但这类似于您的目的:

String gameEntry = input.nextLine();
allGameData.add(gameEntry);
String[] splitGameEntry = input.nextLine().split(" , ");
game.add(splitGameEntry[0]);
hours.add(Integer.parseInt(splitGameEntry[1]));

我不确切地知道您尝试使用此代码完成的任务,但您可能希望将游戏/小时组织成一个包含两个值的类。您的代码看起来像这样:

public class GameInfo
{
    private String name;
    private int hours;

    public GameInfo(String name, int hours)
    {
        this.name = name;
        this.hours = hours;
    }

    [getters/setters]

    @Override
    public String toString()
    {
        return name + ":  " + hours + " hours played!";
    }
}

public class Main
{

    public void doSomething()
    {
        Scanner input = new Scanner(System.in);

        List<GameInfo> gameInfo = new ArrayList<>();

        String[] gameEntry = input.nextLint().split(" , ");

        gameInfo.add(new GameInfo(gameEntry[0], Integer.parseInt(gameEntry[1]));

        for(GameInfo gameInfoPiece : gameInfo)
        {
            System.out.println(gameInfoPiece);
        }
    }
}

使用这种方法,您可以根据需要在GameInfo类中添加尽可能多的信息。例如,如果您想将hours更改为expectedHoursToComplete并添加actualHoursToComplete,则可以轻松完成此操作。

答案 2 :(得分:0)

如果您重新考虑您的方法,您可能会觉得更容易。为什么不将它们全部存储在单个Map<String,Integer>中,而不是有3个单独的列表,其中键是游戏名称,值是小时数。

您的代码如下所示:

    Scanner scan = new Scanner(System.in);

    Map<String, Integer> gameHoursMap = new HashMap<>();

    String currentValue = scan.nextLine();

    // Loop until you meet some criteria to end such as typing q or quit
    while(!currentValue.equalsIgnoreCase("q")){

        // You would need to handle when the value of currentValue doesn't fit what you would normally be expecting before doing the rest
        String[] vals = currentValue.split(",");

        // Call trim method on the String incase there is any lingering whitespace
        gameHoursMap.put(vals[0].trim(), Integer.valueOf(vals[1].trim()));

        currentValue = scan.nextLine();
    }

您显然需要编写一些错误处理,以便在输入不符合您期望的内容时获得要点。

更新:

如果您希望为每个游戏存储更复杂的信息,可以将其包装在自定义类GameInfo中,然后使用Map<String,GameInfo>,其中键是名称,值为{ {1}}。这样您就可以根据名称检索游戏的所有游戏信息。

GameInfo

然后,您可以修改public class GameInfo { private String name; private int hoursPlayed; private int level; // etc } 循环以创建while对象,而不是仅将GameInfoString放入int

Map