Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,更新列表中的对象(如果存在)的fastet和最有效的实现是什么_Java_Performance_Processing Efficiency_Code Complexity - Fatal编程技术网

在java中,更新列表中的对象(如果存在)的fastet和最有效的实现是什么

在java中,更新列表中的对象(如果存在)的fastet和最有效的实现是什么,java,performance,processing-efficiency,code-complexity,Java,Performance,Processing Efficiency,Code Complexity,我有一个问题陈述,它正在发挥作用,但我仍然想知道更高效、更快、更重要的是正确设计来处理下面提到的场景 我有一节POJO课 class A { String s; Double d; } 我试图填充一个列表,基本上是一个对象列表。现在是实施问题。在将对象A添加到列表中时,我需要检查是否已经存在具有字符串s的对象。如果是,我希望使用旧d1+新d1更新旧对象,并且不将新对象添加到列表中,如果否,则将新对象添加到列表中。我目前的实现如下所示 double dd = 0.0; List&

我有一个问题陈述,它正在发挥作用,但我仍然想知道更高效、更快、更重要的是正确设计来处理下面提到的场景

我有一节POJO课

class A {
  String s;
  Double d;
}
我试图填充一个列表,基本上是一个对象列表。现在是实施问题。在将对象A添加到列表中时,我需要检查是否已经存在具有字符串s的对象。如果是,我希望使用旧d1+新d1更新旧对象,并且不将新对象添加到列表中,如果否,则将新对象添加到列表中。我目前的实现如下所示

double dd = 0.0;
    List<A> aList = new List<A>();
    List<A> aListToRemove = new List<A>();
    A newA = null;
    for(int i=0;i<=100;i++ ){
        newA = method call which returns newA;
        for(A oldA: aList ){
            if(oldA.getS().equals(newA.getS())){
                dd = oldA.getD() + newA.getD();
                newA.setD(dd);
                aListToRemove.add(oldA);
            }
            aList.add(newA);
            aList.removeAll(aListToRemove);
        }
    }

//at the end, i would like to see aList with no duplicates, but with updated d value.
double dd=0.0;
列表列表=新列表();
List aListToRemove=新列表();
A newA=null;

对于(int i=0;i),您应该考虑使用.

您应该真正考虑使用.< /p> ,看来您可以使用一个映射来使用用例:

Map<String, A> map = new HashMap<> ();
这将把你的O(n^2)算法变成一个O(n)算法

当您收到
newA
时,您可以使用以下功能:

A a = map.get(newA.getS());
if (a == null) {
    map.put(newA.getS(), newA); //new string => new item in the map
} else {
    a.setD(a.getD() + newA.getD()); //found string => updating the existing item
}

您似乎可以将地图用于您的用例:

Map<String, A> map = new HashMap<> ();
这将把你的O(n^2)算法变成一个O(n)算法

当您收到
newA
时,您可以使用以下功能:

A a = map.get(newA.getS());
if (a == null) {
    map.put(newA.getS(), newA); //new string => new item in the map
} else {
    a.setD(a.getD() + newA.getD()); //found string => updating the existing item
}

它是否必须是一个
列表
?听起来像是一个
映射
可以为您完成这项工作。具体来说,它添加或替换了一个键值对,这非常符合您的语义


干杯,

它必须是一个
列表吗?
听起来像是一个
地图可以帮你完成这项工作。特别是,它添加或替换了一个键值对,这非常符合你的语义


干杯,

如果你想提高效率,我会使用或
映射
这不仅可以更有效地执行查找,而且可以更有效地积累数据。如果你需要将字符串附加在一起,最好的选择可能是使用
映射

A类{
字符串s;
double d;//除非需要空值,否则不要使用double。
}
Map Map=newlinkedhashmap();
for(一个newA:getAs()){
double[]total=map.get(newA.getS());
如果(总计==null)
put(newA.getS(),total=newdouble[0]);
总计[0]+=newA.getD();
}

这将为您提供O(1)查找,并以最少的对象创建量累积值。

如果您希望提高效率,我将使用or
Map
这将使您不仅能够更高效地执行查找,而且能够更高效地累积数据。如果您需要将字符串附加在一起,最好的选择可能是使用
Map

A类{
字符串s;
double d;//除非需要空值,否则不要使用double。
}
Map Map=newlinkedhashmap();
for(一个newA:getAs()){
double[]total=map.get(newA.getS());
如果(总计==null)
put(newA.getS(),total=newdouble[0]);
总计[0]+=newA.getD();
}

这将为您提供O(1)查找,并以最少的对象创建量累积值。

您应该使用
java.util.Set
进行操作

您可以在O(1)时间内检查对象是否存在,并相应地执行操作

它还将负责删除重复项

   double dd = 0.0;
    Set<A> aList = new HashSet<A>();
    A newA = null;
    for(int i=0;i<=100;i++ ){
        newA = //method call which returns newA;
        A oldA = aList.get(newA);
        if(oldA != null){
           aList.remove(oldA);
        }
        dd = oldA.getD() + newA.getD();
        newA.setD(dd);
        aList.add(newA);
    }
double dd=0.0;
Set aList=新的HashSet();
A newA=null;

对于(inti=0;i您应该使用
java.util.Set
进行操作

您可以在O(1)时间内检查对象是否存在,并相应地执行操作

它还将负责删除重复项

   double dd = 0.0;
    Set<A> aList = new HashSet<A>();
    A newA = null;
    for(int i=0;i<=100;i++ ){
        newA = //method call which returns newA;
        A oldA = aList.get(newA);
        if(oldA != null){
           aList.remove(oldA);
        }
        dd = oldA.getD() + newA.getD();
        newA.setD(dd);
        aList.add(newA);
    }
double dd=0.0;
Set aList=新的HashSet();
A newA=null;
对于(int i=0;i考虑使用a。您可以使用get方法检查map中是否有项(似乎s将是键):

考虑使用。您可以使用get方法检查地图中是否有项目(似乎是键):



我是否可以实现一个比较器,并在调用list.add()方法时以某种方式更新列表。这样,更新和添加列表以及删除旧元素将只在调用add或compare方法时发生。请教育我。我是否可以实现一个比较器,并在调用list.add()时以某种方式更新列表方法。这样,只需调用add或compare方法即可更新和添加到列表并删除旧元素。请教育我。您可以始终删除旧条目并在集合中插入新条目。这也是一个O(1)operationTrue,但它增加了复杂性,而
Map
确实是一个更好的选择。是的,在Set的情况下需要一个额外的删除操作。但是如果在这个对象中添加更多的字段,并且在当前情况下,对象的相等性取决于更多的字段,那么Set将不需要在实现中进行任何更改,而Map imp元素需要完全更改,这在映射实现中也是必需的。实际上,如果没有,请阅读中的最后一段,您始终可以删除旧条目并在集合中插入新条目。它也是一个O(1)operationTrue,但它增加了复杂性,而
Map
确实是一个更好的选择。是的,在Set的情况下需要一个额外的删除操作。但是如果在这个对象中添加更多的字段,并且在当前情况下,对象的相等性取决于更多的字段,那么Set将不需要在实现中进行任何更改,而Map imp实现需要完全更改,这在地图实现中也是必需的。事实上,没有,请阅读此方法中的最后一段,d的值是否会得到更新。这应该是我放入地图之前的额外步骤。我已经提到我需要添加d的值。谢谢,但我有一个问题。此实现tion删除了额外的集合元素,但它在性能、内存管理等方面是否足够有效?@sandy它肯定会比使用2个嵌套循环的示例执行得更好