我如何 eliminate/remove 对象数组元素的副本,该元素在数组中重复了很多次。 (Return 相同的数组类型)

How can I eliminate/remove a duplication of an object array element which is duplicated a ton of time in the array. (Return same array type)

我试过这个 for 循环,但是当数组中有重复元素时,内部循环中断,如果数组中放置了超过 10 个重复元素,则外部循环停止。

我需要 return 一个相同对象类型的数组,因为我需要使用这些方法从中选取一些值。

public Mode insT(Guide[] guide){
  Guide[] guideVo = checkGuideDuplication(guide);
}

public Guide[] checkGuideDuplication (Guide[] guide){
  for(int i = 0; i<guide.length-1; i++){
    for(int j = i+1; i<guide.length; i++){
     if(guide[i].getGuide().trim().equals(guide[j].getGuide().trim())){
      guide = (Guide[]) ArrayUtils.remove(guide); 
   }
  }
 }
 return guide;
}

删除元素后需要重置内部索引,以便再次检查(和边界检查):

guide = (Guide[]) ArrayUtils.remove(guide);
j--;

如果使用映射来清除重复项,则可以完全避免内部循环:

public Guide[] checkGuideDuplication (Guide[] guide){
  Map<String, Guide> uniques = new HashMap<>();
  for(Guide g : guide){
    uniques.putIfAbsent(g.getGuide().trim(), g);
  }
  return uniques.values().toArray(new Guide[0]);
}

最高效的 O(N) 解决方案是使用 Map,如 所示。

但是如果由于某些 constraints/limitations 而无法使用 Map(例如只允许数组),另一种解决方案是将删除的元素设置为 null 并计算删除的数目,然后将 nulls 移到数组的末尾和 return 一个截断的数组:

public Guide[] checkGuideDuplication (Guide ... guide) {
    int deleted = 0;
    for (int i = 0; i < guide.length-1; i++) {
        if (null == guide[i]) {
            continue;
        }
        String currGuide = guide[i].getGuide().trim();

        for(int j = i + 1; j < guide.length; j++) {
            if (null == guide[j]) {
                continue;
            }
            if (currGuide.equals(guide[j].getGuide().trim())) {
                guide[j] = null;
                deleted++;
            }
        }
    }
    // shift remaining elements
    for (int i = 0, j = 0; i < guide.length; i++) {
        if (guide[i] != null) {
            guide[j++] = guide[i];
        }
    }
    return Arrays.copyOf(guide, guide.length - deleted);
}