2014-09-24 40 views
0

我想比較同一列表中的元素。如果元素不等於增量計數器,並且它們相等,則計數器保持不變。我有一些正確的問題。 我的名單看起來是這樣的(這些只是由值測試的緣故):比較單個ArrayList中的值並使用java爲其分配新值

List<Double> sample = new ArrayList<Double>(); 
     sample.add(110.00); 
     sample.add(90.00); 
     sample.add(90.00); 
     sample.add(20.00); 
     sample.add(20.00); 

,我需要得到結果爲

[1, 2, 2, 3, 3]. 

這是我到目前爲止,我有嘗試兩種不同的方式。

Double count = 1.0; 
     for(int i = 0; i < sample.size()-1; i++) 
     { 
      Double first = sample.get(i); 
      Double second = sample.get(i+1); 

      if(first.equals(second)) 
      { 
       sample.set(i, count); 
      } 
      else 
      { 
       sample.set(i, count++); 
      } 

     } 

此打印:

[1.0, 2.0, 2.0, 3.0, 20.0] 

我不知道怎麼去比較,去年的兩倍。我知道我沒有檢查列表的大小,因爲我有size() - 1,但我會得到索引超出界限的異常。 第二種方法是:

for (int i = 0; i < sample.size()-1; i++) 
     { 
      for(int j=i+1; j < sample.size(); j++) 
      { 
       if(sample.get(i)==sample.get(j)) 
       { 

        sample.set(i, count); 
       } 
       else 
       { 

        sample.set(i, count++); 

       } 
     } 
     } 

這將打印:

[6.0, 8.0, 10.0, 11.0, 20.0] 

我知道我在循環兩次,但可以在什麼地方進行調整。

+0

你只比較連續元素? – brso05 2014-09-24 20:38:19

+0

在第一個例子中,它應該用3.0代替20。我沒有添加其他計數++,如果它們不相等,它們將增加。 – 2014-09-24 20:42:43

+0

嘗試我發佈它應該爲你所說的工作。 – brso05 2014-09-24 20:50:20

回答

0
Double count = 1.0; 
     for(int i = 0; i < sample.size()-1; i++) 
     { 
      Double first = sample.get(i); 
      Double second = sample.get(i+1); 

      if(first.equals(second)) 
      { 
       sample.set(i, count); 
       if((i + 2) == sample.size()) 
       { 
        sample.set((i+1), count); 
       } 
      } 
      else 
      { 
       sample.set(i, ++count); 
       if((i + 2) == sample.size()) 
       { 
        sample.set((i+1), count); 
       } 
      } 

     } 

試試這個。

+0

使用此代碼我得到[2.0,3.0,4.0,5.0,5.0] ...它需要更多像[1,2,3,2,3]。結果應該是這樣的,因爲110給出了1,第一個元素,元素相鄰的元素相等,產生2,對於值爲20的元素也是一樣的。 – 2014-09-24 20:58:23

+0

對不起,我搞砸了,我現在編輯它。 – brso05 2014-09-24 20:59:42

+0

對不起,上次這個作品我測試了,我需要將i + 1更改爲i + 2。現在複製並粘貼代碼!祝你好運! – brso05 2014-09-24 21:04:11

0

您需要一個countDouble

使用Map

Map<Double, Integer> doubleCount = new HashMap<>(); 
for (double d : sample) { 
    Integer count = doubleCount.get(d); 
    if(count == null) { 
     doubleCount.put(d, 1); 
    } else { 
     doubleCount.put(d, count + 1); 
    } 
} 

// to array 
int[] res = new int[sample.size()]; 
int i = 0; 
for(int d : sample) { 
    res[i++] = doubleCount.get(d); 
} 
+0

這不適合我,但謝謝! – 2014-09-25 13:53:51

0

在你必須處理的最後兩個元素你的第一個例子 - 試試這個:

Double count = 1.0; 
    for(int i = 0; i < sample.size()-1; i++) { 
     Double first = sample.get(i); 
     Double second = sample.get(i+1); 

     if(first.equals(second)) { 
      sample.set(i, count++); 

      if(i==(sample.size()-2)) { 
       sample.set(i, count); 
       sample.set((i+1), count); 
      } else { 
       sample.set(i, count); 
      } 
     } else { 
      sample.set(i, count); 

      if(i==(sample.size()-2)) 
       sample.set((i+1), count); 
      else 
       sample.set(i, count); 
     } 
    } 
+0

這不適合我,但謝謝你! – 2014-09-25 13:53:28

+0

好吧,它適合我。它給了我這個輸出:[1.0,2.0,2.0,3.0,3.0] – NerosE 2014-09-25 18:00:00