Java 在保持平行列表同步的同时删除重复项
这个问题让我发疯。我有vectorA(float)、vectorB(string1)、vectorC(string2),它们是并行的,我想消除vectorA中的重复项,同时设法保留 向量之间的平行性。 有什么想法吗?为您看到的项目创建一个Java 在保持平行列表同步的同时删除重复项,java,vector,Java,Vector,这个问题让我发疯。我有vectorA(float)、vectorB(string1)、vectorC(string2),它们是并行的,我想消除vectorA中的重复项,同时设法保留 向量之间的平行性。 有什么想法吗?为您看到的项目创建一个集合,扫描vectorA记录重复索引,然后删除标记为重复的索引,同时从向量末尾返回 Set<Float> seen = new HashSet<Float>(); List<Integer> del = new List<
集合
,扫描vectorA
记录重复索引,然后删除标记为重复的索引,同时从向量末尾返回
Set<Float> seen = new HashSet<Float>();
List<Integer> del = new List<Integer>();
for (int i = 0 ; i != vectorA.size() ; i++) {
if (seen.add(vectorA[i])) {
del.add(i);
}
}
for (int i = del.size()-1 ; i >= 0 ; i--) {
vectorA.remove(del[i]);
vectorB.remove(del[i]);
vectorC.remove(del[i]);
}
Set seen=new HashSet();
List del=新列表();
for(int i=0;i!=vectorA.size();i++){
如果(见。添加(向量[i])){
del.添加(i);
}
}
对于(int i=del.size()-1;i>=0;i--){
向量删除(del[i]);
向量b.remove(del[i]);
向量删除(del[i]);
}
返回很重要,因为否则您的索引将失去同步。为您看到的项目创建一个集
,扫描vectorA
记录重复索引,然后删除标记为重复的索引,同时从向量末尾开始返回
Set<Float> seen = new HashSet<Float>();
List<Integer> del = new List<Integer>();
for (int i = 0 ; i != vectorA.size() ; i++) {
if (seen.add(vectorA[i])) {
del.add(i);
}
}
for (int i = del.size()-1 ; i >= 0 ; i--) {
vectorA.remove(del[i]);
vectorB.remove(del[i]);
vectorC.remove(del[i]);
}
Set seen=new HashSet();
List del=新列表();
for(int i=0;i!=vectorA.size();i++){
如果(见。添加(向量[i])){
del.添加(i);
}
}
对于(int i=del.size()-1;i>=0;i--){
向量删除(del[i]);
向量b.remove(del[i]);
向量删除(del[i]);
}
返回很重要,因为否则您的索引将失去同步。创建一个类,将这三个值组合在一起,并覆盖
等于和hashCode
。将这些实例添加到单个列表,而不是三个并行列表。一旦您准备好删除重复项(假设您需要先保留它们并在以后删除它们),将它们添加到LinkedHashSet
并返回到ArrayList
LinkedHashSet
将在删除重复项的同时保持插入顺序(如果这不重要,请使用标准的HashSet
)
class Triple {
float num;
String a;
String b;
public boolean equals(Object o) {
if (o == null || !(o instanceof Triple))
return false;
return num == ((Triple)o).num; // strict equality
}
public int hashCode() {
return Float.floatToRawIntBits(num);
}
}
List<Triple> removeDuplicates(List<Triple> items) {
return new ArrayList<Triple>(new LinkedHashSet<Triple>(items));
}
三级{
浮点数;
字符串a;
b串;
公共布尔等于(对象o){
if(o==null | |!(三元组的o实例))
返回false;
return num==((三元组)o).num;//严格相等
}
公共int hashCode(){
返回Float.floatToRawIntBits(num);
}
}
列表移除的副本(列表项){
返回新的ArrayList(新的LinkedHashSet(items));
}
创建一个类,将这三个值组合在一起,并覆盖等于和hashCode
。将这些实例添加到单个列表,而不是三个并行列表。一旦您准备好删除重复项(假设您需要先保留它们并在以后删除它们),将它们添加到LinkedHashSet
并返回到ArrayList
LinkedHashSet
将在删除重复项的同时保持插入顺序(如果这不重要,请使用标准的HashSet
)
class Triple {
float num;
String a;
String b;
public boolean equals(Object o) {
if (o == null || !(o instanceof Triple))
return false;
return num == ((Triple)o).num; // strict equality
}
public int hashCode() {
return Float.floatToRawIntBits(num);
}
}
List<Triple> removeDuplicates(List<Triple> items) {
return new ArrayList<Triple>(new LinkedHashSet<Triple>(items));
}
三级{
浮点数;
字符串a;
b串;
公共布尔等于(对象o){
if(o==null | |!(三元组的o实例))
返回false;
return num==((三元组)o).num;//严格相等
}
公共int hashCode(){
返回Float.floatToRawIntBits(num);
}
}
列表移除的副本(列表项){
返回新的ArrayList(新的LinkedHashSet(items));
}
这里有一个单通道就地算法:
Set<Float> seen = new HashSet<Float>();
int uniques = 0;
for (int i = 0; i < n; i++) {
if (seen.add(vectorA[i])) {
vectorA[uniques] = vectorA[i];
vectorB[uniques] = vectorB[i];
vectorC[uniques] = vectorC[i];
uniques++;
}
}
Set seen=new HashSet();
int uniques=0;
对于(int i=0;i
完成后,忽略位置uniques
后的所有元素(或将它们全部复制到新数组中)。这里是一个单遍就地算法:
Set<Float> seen = new HashSet<Float>();
int uniques = 0;
for (int i = 0; i < n; i++) {
if (seen.add(vectorA[i])) {
vectorA[uniques] = vectorA[i];
vectorB[uniques] = vectorB[i];
vectorC[uniques] = vectorC[i];
uniques++;
}
}
Set seen=new HashSet();
int uniques=0;
对于(int i=0;i
完成后,忽略positionuniques
之后的所有元素(或将它们全部复制到新数组中)。vectorA
排序了吗?你是在试图消除精确的重复,还是在某个ε内的重复,还是什么?向量是排序的还是什么?你是在试图消除精确的重复,还是在某些epsilon中消除重复,或者什么?thnx它似乎有正确的逻辑,但我在java中找不到这些方法(?)。插入()?PASSUBED()?@ USE129683OOPS,我写了C++代码而不是java:它现在应该工作。你是指DEL EELMATAT(i)?@ USE129683-假设它是向量,我是说。这是线程“主”java. Lang.ArayIdxOutOfFunsExpReExp:Excel 5中的输出异常:5,我认为你是对的,我缺少了一些东西…哼哼,它似乎有正确的逻辑,但是我在java中找不到这些方法(?)。插入()?PASSUBED()?@ USE129683OOPS,我写了C++代码而不是java:它现在应该工作。你是指DEL EELMATAT(i)?@ USE129683-假设它是向量,我是说。这是线程“主”java. Lang.ArayIdxOutOfFunsExpRebug:5的值= 5的输出异常。我认为你是对的,我缺少一些东西…哼哼。