2015-11-25 1 views
1

Моя проблема заключается в том, что пользователь вводит текст, он должен иметь два элемента для разделения при использовании .split(), однако с разделяемыми элементами, как я помещаю их в разные списки, чтобы Для выполнения вычислений я могу использовать целочисленный список.Java разделяет и добавляет элементы в корригирующие типы данных arraylists

например. пользователь вводит «skyrim, 100», запись «skyrim» - это строка, но с номером (целое число) «100». Я хочу разбить его на удаление запятой и добавить его в ArrayList для вычислений и с другими добавленными вложениями.

название игры (строка), часы (целые) < - шаблон

  1. Skyrim, 100
  2. забытье, 25
  3. GTA V, 50

поэтому перечисленные пункты выше пользовательский ввод с двумя аргументами, разделенными запятой, которые будут разделены, тогда мне нужно добавить их к разным 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); 
} 

так здесь я должен:

Skyrim, 100, забвение, 25, GTAV, 50

Как я поставил имена игру в списке игр и цифры в часы список?

+0

В каждой строке, это первая запись всегда будет ' String', а второй всегда будет 'int'? В вашем примере это, похоже, так. [skyrim, 100] [oblivion, 25] [gtav, 50] – DoubleDouble

+0

Да, именно это, String, затем int – Aetherox

ответ

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.

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])); 
} 
+0

, но как бы «игра» и «часы» добавляли элементы из «allGameData», поскольку я использую этот массивList, чтобы добавлять элементы из пользовательского ввода и разбивать его так, чтобы его можно было поместить в «игру и часы», не нужно ли мне ссылаться на элементы из allGameData? – Aetherox

+0

@Aetherox Я бы не разделил строку до тех пор, пока вы не добавите ее в список 'allGameData'. Затем разделите и добавьте в 'game' и' hours'. Позвольте мне обновить решение, чтобы обеспечить лучший контекст. – gonzo

+0

может использовать это небольшое решение с петлей, чтобы получить больше записей, разбить его, а затем поместить в соответствующие arraylists, чтобы я не писал game.add (parsedData [0]); hours.add (Integer.parseInt (parsedData [1])); снова и снова для добавления дополнительных элементов – Aetherox

0

Вы можете использовать Integer.parseInt(). Код, который Вы представили выглядит псевдо-Codey, но это что-то вроде того, что вы собираетесь:

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, вы можете легко это сделать.

+0

, как бы я сделал это с несколькими входами ввода без необходимости писать add (gameentry [0]), а затем добавить (gameEntry [ 2]) каждый раз, когда пользователь вводит что-то, потому что он будет расти в 2-х для строковых элементов? – Aetherox

+0

@Aetherox Вы хотите только одну запись в allGameData за каждую строку, представленную пользователем? – sfedak

+0

Да, одна запись на каждую строку, поэтому я вхожу в «skyrim, 100», а затем, возможно, добавляю больше записей, затем разделяю их и помещаю их в разных arraylists. – Aetherox

0

Вам может быть легче, если вы переосмыслите свой подход. Вместо того, чтобы иметь 3 отдельных списка, почему бы не сохранить их все в одном Map<String,Integer>, где ключ является именем игры, а значением является количество часов.

Ваш код будет выглядеть примерно так:

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(); 
    } 

Вы бы, очевидно, нужно написать обработку ошибок, когда входные данные не соответствует тому, что вы ожидали, но вы получите суть.

UPDATE:

Если вы хотите иметь более сложную информацию, хранящуюся в каждой игре вы можете обернуть его в пользовательском классе GameInfo, а затем есть Map<String,GameInfo> где ключ это имя и значение является GameInfo. Это позволит вам получить всю информацию о игре для игры, основанную только на имени.

public class GameInfo { 

    private String name; 
    private int hoursPlayed; 
    private int level; 

    // etc 
} 

Вы бы затем изменить цикл while для создания GameInfo объекта вместо того, чтобы просто положить String и int в Map

// Create the GameInfo object from the corresponding input supplied by the user 
GameInfo game = new GameInfo(vals[0].trim(), Integer.valueOf(vals[1].trim()), Integer.valueOf(vals[2].trim())); 

// Put it in the map with the name as the key 
gameMap.put(game.getName(), game); 
+0

Могу ли я увеличить эту карту, чтобы взять больше типов данных, например. map Aetherox

+0

Я обновлю свой ответ, чтобы объяснить, что вы могли бы сделать ... вы не можете делать то, что только что написано 'map ', поскольку карта может иметь только пара ключ-значение – kstandell

Смежные вопросы