2014-10-07 4 views
0

У меня есть эта проблема, что я не знаю, как подойти. У меня есть два списка массива, один, который содержит строку, а другой, содержащий целые числа, например:пары значений arraylists в java

* Utah   5 
* Nevada   6 
* California 12 
* Oregon  8 
* Utah   9 
* California 10 
* Nevada  4 
* Nevada  4 
* Oregon  17 
* California 6 

и мне нужно, чтобы получить результат, как это в списках массива: Юта [5, 9] Невада [6 , 4, 4] California [12, 10, 6].

Я честно не знаю, как подойти к этому, и я ищу совет о том, как это сделать.

Мне было предложено использовать arraylist Arraylist, и это то, что у меня есть до сих пор.

int i=0; 
     ArrayList<ArrayList<Integer>> values = new ArrayList<ArrayList<Integer>>(); 

     while (i<categories.size()) 
     { 
      String cat=categories.get(i); 
      i++; 
      for (int r = 0; r < column1.size();r++) { 
       if(column1.get(r)==cat) 
       { 
        int value = column2.get(r); 
        ArrayList<Integer> val=new ArrayList<Integer>(); 
        val.add(value); 
        values.add(val); 
       } 
     } 

Column1 = список состояний, column2 = список целых чисел и категории = список категорий.

Моя проблема в том, что цикл for, кажется, просто добавляет один и тот же массив снова и снова, пока цикл while не будет выполнен. Какие-либо предложения?

+2

'Карта >'? –

+0

Почему бы не создать еще 2 ArrayList, который содержит имена, но только один экземпляр каждого имени, а затем другой, который будет проходить через первый (а не третий) arraylist и если значение соответствует значению (нужен цикл, который проходит все они) от 3-го arraylist, затем добавьте это значение в 4-й arraylist и повторите. Думаю, это сработает. Это для домашнего задания? – DreadHeadedDeveloper

+0

Да, это для домашней работы, но я думаю, что я не понимаю, как узнать, какие значения перед категориями (utah, nevada, california), так как я не могу их видеть, я просто, возможно, просто по номеру индекса? –

ответ

5

Вы можете решить эту проблему, используя следующий подход:

List<String> states = Arrays.asList(
     "Utah", "Nevada", "California", "Oregon", "Utah", 
     "California", "Nevada", "Nevada", "Oregon", "California" 
    ); 

List<Integer> values = Arrays.asList(5, 6, 12, 8, 9, 10, 4, 4, 17, 6); 


Map<String, List<Integer>> resultMap =HashMap<String, Arraylist<>>(); 

for(int i = 0; i < states.size(); i++) 
    { 
      if(resultMap.get(states.get(i))!=null){ 
       resultMap.get(states.get(i)).add(values.get(i)); 
      }else{ 
      List<Integer> valuelist = new ArrayList<>(); 
      valuelist.add(values.get(i)); 
      resultMap.put(states.get(i),valuelist); 
      } 
    } 

resultMap содержит ваш необходимый ответ.

+0

Как это получилось 6 upvotes? Он даже не компилируется. –

+0

это подход к проблеме ... его не 100% синтаксическая ошибка бесплатно @JeffreyBosboom .. – Karunakar

2

Это кажется как вопрос домашнего задания уровня, и это довольно просто решить, используя списки Integer в Map шпонкой по String. Я отвечаю, чтобы игры с продемонстрировать некоторые из новых Java 8 функции:

List<String> states = Arrays.asList(
     "Utah", "Nevada", "California", "Oregon", "Utah", 
     "California", "Nevada", "Nevada", "Oregon", "California" 
    ); 
    List<Integer> values = Arrays.asList(
     5, 6, 12, 8, 9, 
     10, 4, 4, 17, 6 
    ); 
    assert states.size() == values.size(); 

    Map<String, List<Integer>> collated = new LinkedHashMap<>(); 
    for (int i = 0, len = states.size(); i < len; i++) { 
     String state = states.get(i); 
     Integer value = values.get(i); 
     collated.computeIfAbsent(state, x -> new ArrayList<>()).add(value); 
    } 
    collated.forEach((k,v) -> System.out.printf("%s %s%n", k, v)); 

Выход:

Utah [5, 9] 
Nevada [6, 4, 4] 
California [12, 10, 6] 
Oregon [8, 17] 
+0

спасибо человеку, я пытаюсь понять, как это работает, но, честно говоря, есть несколько вещей, которые мне не знакомы вообще. Как и на карте. Я буду пытаться понять это. –

+1

Начните с поиска в Google для незнакомых вам имен классов. Прочтите Javadoc для этих классов API и их методов, если вы все еще запутались, прочитайте их снова. –

1

Вот еще один способ, чтобы вычислить это с Java 8 функций, но с потоками на этот раз. (Строительные леса от @William Price's answer)

List<String> states = Arrays.asList(
    "Utah", "Nevada", "California", "Oregon", "Utah", 
    "California", "Nevada", "Nevada", "Oregon", "California" 
); 
List<Integer> values = Arrays.asList(5, 6, 12, 8, 9, 10, 4, 4, 17, 6); 
assert states.size() == values.size(); 

Map<String, List<Integer>> collated = IntStream.range(0, states.size()).boxed().collect(
    Collectors.groupingBy(states::get, LinkedHashMap::new, 
     Collectors.mapping(values::get, Collectors.toList()))); 

collated.forEach((k,v) -> System.out.printf("%s %s%n", k, v)); 

Работа с несколькими источниками входного сигнала может быть неудобны в потоках, но с использованием потока индексов идеально подходит для этого «соответствующего списку» случае. groupingBy классифицирует индексы по их значению в списке states, mapping сопоставляет индексы с их значением в списке values и toList, ну и собирает их в список. Использование LinkedHashMap сохраняет порядок вставки.

+0

+1 Хорошая вариация, демонстрирующая потоки и коллекционеры. Наверное, труднее для случайного ученика понять сначала, но больший потенциал для этого «а-ха!». ламповый момент. –

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