2013-02-19 44 views
0

我使用的名單,如下圖所示計數: -沒有能在ArrayList中使用Java

List<Integer> integerlist = new ArrayList<Integer>(); 

integerlist=primeFactors(numberToBERadical); 

的primeFactors方法返回我一些號碼時我SYSOUT爲: -

System.out.println("integer list=="+integerlist); 
integer list==[2, 2, 2, 3, 5] 

我的問題是我想看看有多少時間,每個數字出現,這樣我可以顯示像這樣: -

2^3 * 3 * 5 
+3

如何使用地圖,而不是一個列表? – 2013-02-19 11:59:03

+0

使用「Map 」鍵是素數,並且對於素數的每次出現都增加該值。 – vstm 2013-02-19 11:59:14

+0

感謝您的回覆,可以給我一些更多的細節,以便我可以實施。 – ASUR 2013-02-19 12:01:35

回答

2

如果數組進行排序,你可以指望他們像:

int count = 0; 
int last = 0; // zero is not possible for prime-factors 
for(int i=0;i<list.size();i++) { 
    if(i == 0 || last == list.get(i)) count++; 
    else { 
     if(last > list.get(0)) { 
      System.out.print(" * "); 
     } 

     System.out.print(last + (count > 1 ? "^" + count: "")); 
     count = 1; 
    } 
    last = list.get(i); 
} 
//print last sequence. 
if(last > 0) { 
    if(last > list.get(0)) { 
     System.out.print(" * "); 
    } 

    System.out.print(last + (count > 1 ? "^" + count: "")); 
} 
+0

你的環路不會從1開始工作:P – 2013-02-19 12:04:24

+0

我在演示一個想法...以及我相應地更新了它。 – 2013-02-19 12:09:40

1

一種可能,但不是那麼簡單lution:

public Map<Integer, AtomicInteger> primeFactors(List<Integer integerList) { 
    final Map<Integer, AtomicInteger> count = new HashMap<Integer, AtomicInteger>(); 

    for (final Integer number : integerlist) { 
    if (count.containsKey(number)) { 
     count.get(number).incrementAndGet(); 
    } else { 
     count.put(number, new AtomicInteger(1)); 
    } 
    } 

    return count; 
} 
1

您需要使用Map<Integer, Integer>,你可以以統計每個Integer的情況下覆蓋put方法Standard。

final Map<Integer, Integer> myStringMap = new HashMap<>(){ 
@override 
public String put(final Integer key, final Integer value) { 
    if(contains(key)) { 
    return put(key, get(key) + 1); 
    } else { 
    return put(key, 1); 
    } 
} 
}; 

您甚至可以使用TreeMap使主要因素按大小排序。我回答了一個非常類似的問題here。簡單地循環在你的List並轉存到地圖

for(final Integer integer : myList) { 
    myCountingMap.put(integer, 1); 
} 

更妙的是改變你的因子分解方法返回一個Map開始。

3

你需要每一個因素隨着時代它發生數(指數)相關聯。

要做到這一點,比列表更好的數據結構將是Map<Integer,Integer>

我們假設您仍然從primeFactors(numberToBERadical);得到List(假設您無法更改或不想出於某種原因)。

你可以這樣做:

public static void main(String[] args) { 
    List<Integer> list = new ArrayList<>(); 

    list.add(2); 
    list.add(2); 
    list.add(2); 
    list.add(3); 
    list.add(3); 
    list.add(5); 

    Map<Integer, Integer> factors = new HashMap<>(); 
    for(Integer fact: list){ 
     if(!factors.containsKey(fact)) { factors.put(fact, 1);} 
     else { 
      Integer value = factors.get(fact); 
      factors.put(fact, ++value); 
     } 
    } 
    System.out.println(factors); 
} 

打印:{2=3, 3=2, 5=1}

+0

先生無法正常工作。儘管我的列表是[2,2,2,3,5],但我使用了上面的方法,但因子變量給我==> {2 = 1,3 = 1,5 = 1},它應該是{2 = 3, 3 = 1,5 = 1} – ASUR 2013-02-19 12:22:19

+0

剛剛經過測試並打印出結果,有一點重構 – pcalcao 2013-02-19 12:27:04

+0

它的工作感謝先生。 – ASUR 2013-02-19 12:38:38

0
List<Integer> inputList = new ArrayList<Integer>(); 

    inputList.add(2); 
    inputList.add(2); 
    inputList.add(2); 
    inputList.add(3); 
    inputList.add(3); 
    inputList.add(4); 

    Map<Integer, Integer> resultMap = new HashMap<Integer, Integer>(); 

    boolean flag = false; 

    for(int val : inputList) 
    { 
     if(resultMap.get(val) == null) 
     { 
      resultMap.put(val, 1); 
     } 
     else 
     { 
      resultMap.put(val, (resultMap.get(val).intValue())+1); 
     } 
    } 

    for(int key : resultMap.keySet()) 
    { 
     if(resultMap.get(key) == 1) 
     { 
      if(!flag) 
      { 
       System.out.print(key); 
       flag = true; 
      } 
      else 
      { 
       System.out.print("*"+key); 
      } 
     } 
     else 
     { 
      if(!flag) 
      { 
       System.out.print(key+"^"+resultMap.get(key)); 
       flag = true; 
      } 
      else 
      { 
       System.out.print("*"+key+"^"+resultMap.get(key)); 
      } 
     } 
    } 

    System.out.println();