2015-05-08 27 views
0

我需要調用GetNewItem函數百萬次;Java - 結構交集ArrayList

Items XY = GetNewItem(X, Y); 
Items XYZ = GetNewItem(XY, Z); 
Items XZ = GetNewItem(X, Z); 
Items YZ = GetNewItem(Y, Z); 

該功能的目的是ArrayList的結構的 1-發現路口之間

ArrayList<Records> RecordLists 

2和它也計算爲新的ArrayList的概率,這是我的代碼:

class Records { 

     public int RecordId; 
     public double Prob; 
    } 

    class Items { 
     public ArrayList<Integer> itemId; 
     public ArrayList<Records> RecordLists; 
     public double ItemProb = 0.0; 

    }; 

private ArrayList<Records> Intersection(ArrayList<Records> list1, ArrayList<Records> list2) { 
     ArrayList<Records> Result = new ArrayList<>(); 

      int i = 0, j = 0; 
      while (i < list1.size() && j < list2.size()) { 
       if (list1.get(i).RecordId== (list2.get(j).RecordId)) { 
        Records RecordDetails= new Records(); 
        RecordDetails.RecordId= list1.get(i).RecordId; 
        RecordDetails.Prob+= 1; 
        Result.add(RecordDetails); 

        i++; 
        j++; 
       } else if (list1.get(i).RecordId < list2.get(j).RecordId) { 
        i++; 
       } else if (list1.get(i).RecordId > list2.get(j).RecordId) { 
        j++; 
       } 

      } 

     return Result; 
    } 

    public Items GetNewItem(Items item1, Items item2) { 
     Items NewItem = new Items(); 
     ArrayList<Integer> newItemId = new ArrayList<>(); 
     newItemId.addAll(item1.itemId); 
     newItemId.addAll(item2.itemId); 

     NewItem.itemId = newItemId; 

     NewItem.RecordLists= Intersection(item1.RecordLists,item2.RecordLists); 

     NewItem.ItemProb = getProb(NewItem.RecordLists);   
     return NewItem ; 
    } 

    private double getProb(ArrayList<Records> RProb) { 
     double IProb = 0.0; 
     for (int i = 0; i < RProb.size(); i++) { 
      IProb += RProb.get(i).Prob; 
     } 
     return IProb ; 
    } 

對於此代碼我得到'內存不足錯誤'

我不知道如何節省內存和時間,我想這個解決方案: java.lang.OutOfMemoryError: Java heap space with NetBeans

但我的電腦沒有凍結。我不知道我還有什麼要做。

+0

爲什麼你需要調用函數一百萬次? –

回答

0
  1. 請使用Java慣例,例如,變量在駝峯的情況下,類中的非公共變量(使用getters/constructor/setters)

  2. 我不知道爲什麼你得到的交點,這種方式,與我和j變量。 請嘗試:

    public <T> List<T> intersection(List<T> list1, List<T> list2) { 
        List<T> list = new ArrayList<T>(); 
    
        for (T t : list1) { 
         if(list2.contains(t)) { 
          list.add(t); 
         } 
        }  
        return list; 
    } 
    

如果要計算別的東西,也許這樣做在一個單獨的方法?

  1. 使用花車而不是雙打。

請問您可以粘貼整個代碼嗎?我想重現這一點。