我的问题是当用户输入文本时,在使用.split()时应该有两个要分割的元素,但是如果它分割的项目如何将它们放入不同的列表中,以便我可以使用基于整数的列表进行计算。
e.g。 用户输入" skyrim,100" '天际' entry是一个字符串但是数字(整数)' 100'我想拆分它,删除逗号并将其添加到ArrayList进行计算并添加其他输入。
游戏名称(字符串),小时(整数)< - 模板
所以上面列出的项目是用户输入,其中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如何将游戏名称放入游戏列表,将数字放入小时列表?
答案 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
,因此在您的情况下,您会添加到game
和hours
列表中,如:
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
对象,而不是仅将GameInfo
和String
放入int
Map