Java 比较不同类型对象列表的有效方法
有两类不同类型的。 我有一个Java 比较不同类型对象列表的有效方法,java,collections,comparator,comparable,Java,Collections,Comparator,Comparable,有两类不同类型的。 我有一个列表和列表。在这些列表中,若代码和占用值相同,我需要将其移动到不同的列表中。 我如何才能做到这一点,谷歌给了我这么多的选择行可比,比较器。让我知道实现这一目标的最有效方法。 提前感谢。我会使用自己定义的方法来实现这一点,一个布尔值或类似的方法,将给定的列表项作为参数。以及守则: public class State{ String code; int occurValue; int name; } public class Equi{ String code;
列表
和列表
。在这些列表中,若代码和占用值相同,我需要将其移动到不同的列表中。
我如何才能做到这一点,谷歌给了我这么多的选择行可比,比较器。让我知道实现这一目标的最有效方法。
提前感谢。我会使用自己定义的方法来实现这一点,一个
布尔值
或类似的方法,将给定的列表项作为参数。以及守则:
public class State{
String code;
int occurValue;
int name;
}
public class Equi{
String code;
int occurValue;
int macAddress;
}
//例如,您必须使用for循环迭代该方法
//在不同的情况下,您需要不同的迭代方法,例如添加
//1个元素到Equi:
//您将所有状态元素与新的Equi元素进行比较,但仅与该元素进行比较
对于(int i=0;i
通过这种方式,您可以将此方法用于所有比较,但每次都需要编写迭代器。这意味着更多的编码,但更少的运行时间。例如,如果列表按ABC顺序按
code
排序,您可以避免使用标志或任何东西将“k*”与“a*”进行比较。这在很大程度上取决于您对“高效”的定义
如果你对时间不感兴趣,你可以创建一个double-foreach循环,并对每个项目进行比较。这是一种蛮力,没有时间效率(就像O(n^2)),但可以为你节省大量编程时间,你可以花在更有用的东西上。相当少的项目也是如此(我建议<10.000),在这种情况下,时间优化通常不会带来任何好处
如果您希望节省时间,您可以使用一些抽象数据结构来帮助您。例如,如果“code”-字段在每个集合中都是唯一的,创建一个HashMap,其中键指向“code”该值是Equi referencet。然后,您可以迭代您的状态并查询HashMap以查找匹配的Equi。向返回的Equi询问其占用值。您还可以引入第二个以占用值为键的HashMap。这应该为比较部分提供O(n)。
一种更为面向对象的方法是创建一个接口IHasCodeAndOccurValue,让State和Equi实现它。然后在两个类中实现equals(IHasCodeAndOccurValue other)方法。将两个数据集分别插入一个列表中,并调用stateList.Retainal(equiList)。这可能是最优雅的方法,,并且根据您选择的列表实现,也可以在O(n)中运行
如您所见,有几种方法可以优化此代码。在不了解详细信息的情况下,这纯粹是猜测如何继续。如果列表中没有其他信息,则最有效的算法是将一个列表中的每个元素与另一个列表中的每个元素进行比较:
//You have to iterate the method with a for loop for example
//In different situations you need different iterating methods, for example you add
//1 element to Equi:
//You compare all State element with the new Equi element, but just with that ONE
for (int i =0; i < stateList.size(); i++ {
flag = compare(stateList.get(i),equiList.get(<indexOfNewElement>); // flag is a boolean value
if (flag) {
//moving metod and stuff...
}
}
//this way you don't make unnecessary steps. It's one example, there are many other situation
Boolean compare(State state, Equi equi) { // You add List elements as parameters
if (state.getCode().equals(equi.getCode())) { // I prefer to use getters, it depends on your code and preferences
if (state.getOccurValue() == equi.getOccurValue()) { //same here
return true; //If returns true, an other method move it.
} else {
return false;
}
} else { //if the first ones aren't equal needless to check the second values
return false;
}
}
这是O(n*m)(其中n是stateList的大小,m是equiList的大小)
如果对这两个列表进行排序,则可以使用更高效的算法。例如,在伪代码中:
for (State s : stateList) {
for (equi e : equiList) {
if (s.code.equals(e.code) && s.occurValue == e.occurValue) {
// add to another list
}
}
}
for(int i=0;i
这是O(m+n)。当然,要想实现这一点,您必须编写比较函数(一个用于比较状态
和状态
,一个用于比较相等
和相等
以及一个用于比较状态
和相等
)
顺便说一下,Java命名约定规定类以大写字母开头,因此它应该是
Equi
,而不是Equi
定义“高效”-代码行、复杂性、运行时?您的问题需要具体才能得到准确的答案。@mabi运行时性能。这是一个对象列表,您需要遍历每个对象?是的,它是竞争部分。您可以在for循环中对整个列表、部分列表或单个对调用它。这样您就不需要调用w如果不需要,每次都会列出孔列表此代码将不起作用!使用==运算符进行字符串比较是对引用的比较,除非它们被插入,否则无法保证这会按预期进行。请改用equals运算符。我不知道有getCode()
方法,用于列表
类型。而使用包装类布尔值
有一个特定的原因?最好不要编写整个代码:)。在这种情况下,将代码编写为伪代码或添加注释(如//implemental loops)以获取列表元素等可能是有意义的,这样读者就知道,此代码还没有准备好使用,他应该完成它以使用它。
for (int i = 0; i < stateList.size(); i++) {
int j = 0;
State s = stateList.get(i);
while (equiList.get(j) is smaller than s) {
j++;
}
equi e = equiList.get(j);
if (s.code.equals(e.code) && s.occurValue == e.occurValue) {
// add to another list
}
}