【问题标题】:Java - ArrayList of structure IntersectionsJava - 结构交叉点的 ArrayList
【发布时间】:2015-07-19 17:35:42
【问题描述】:

我需要调用GetNewItem函数百万次;

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

此功能旨在 1-找到结构的ArrayList之间的交集,即

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

但我的电脑确实死机了。我不知道我还需要做什么。

【问题讨论】:

  • 为什么需要调用函数一百万次?

标签: java arraylist


【解决方案1】:
  1. 请使用 java 约定,例如骆驼情况下的变量,类中的非公共变量(使用 getters/constructor/setters)

  2. 我不知道你为什么用 i 和 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. 使用浮点数而不是双精度数。

你能粘贴整个代码吗?我想重现这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多