2014-10-07 54 views
0

我有這個問題,我不知道如何處理。我有兩個數組列表,一個包含字符串,而另一個含整數的,像這樣:java中arraylist的配對值

* 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]加州[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 = states列表,column2 =整數列表和categories = categories列表。

我現在的問題是for循環似乎只是一遍又一遍地添加相同的數組,直到while循環完成。有什麼建議麼?

+2

'Map >'? – 2014-10-07 03:55:32

+0

爲什麼不創建另外2個ArrayList,一個持有名稱但每個名稱只有一個實例,然後另一個會通過第一個(而不是第三個)arraylist,如果值匹配一個值(需要一個經過的循環他們都)從第三陣列,然後將該值附加到第四陣列,並重復。我認爲這會奏效。這是爲了做家庭作業嗎? – DreadHeadedDeveloper 2014-10-07 03:58:18

+0

是的,它是作業,但我想我沒有得到的是如何知道什麼值在前面的類別(猶他州,內華達州,加利福尼亞州),因爲我不能真正看到他們,我只是雖然也許只是索引號? – 2014-10-07 04:16:20

回答

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

結果映射包含您所需要的答案。

+0

這是如何得到6 upvotes?它甚至沒有編譯。 – 2014-10-09 03:24:35

+0

這是一個解決問題的方法......它不是100%的語法錯誤免費@JeffreyBosboom .. – Karunakar 2014-10-09 03:44:11

2

似乎像功課層次的問題,這是相對簡單的解決Integer使用列表中通過String鍵控Map。我回答,以 把玩 演示一些較新的的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

感謝的人,我試圖理解這是如何工作,但老實說,有幾件事我不熟悉。像密鑰圖一樣。我會繼續努力去理解它。 – 2014-10-07 04:29:55

+1

首先對Google不熟悉的類名進行搜索。如果您仍然感到困惑,請閱讀Javadoc以瞭解這些API類及其方法,然後再次閱讀它們。 – 2014-10-07 04:32:48

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

用多個輸入電源的工作可以是在流尷尬,但是使用索引的流是完美的這種「對應列表」的情況。 groupingBystates列表中的值對索引進行分類,mapping將索引映射到它們在values列表中的值,toList將它們收集到列表中。使用LinkedHashMap可保留插入順序。

+0

+1展示流和收藏家的好變異。開始時對一個隨便的學生來說可能很難掌握,但對這個「a-ha!」有更大的潛力。燈泡時刻。 – 2014-10-08 06:01:22