Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 在保持平行列表同步的同时删除重复项_Java_Vector - Fatal编程技术网

Java 在保持平行列表同步的同时删除重复项

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(float)、vectorB(string1)、vectorC(string2),它们是并行的,我想消除vectorA中的重复项,同时设法保留 向量之间的平行性。 有什么想法吗?

为您看到的项目创建一个
集合
,扫描
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

完成后,忽略position
uniques
之后的所有元素(或将它们全部复制到新数组中)。

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的输出异常。我认为你是对的,我缺少一些东西…哼哼。