【问题标题】:Removing duplicates in an Array-based unsorted list without sets在没有集合的基于数组的未排序列表中删除重复项
【发布时间】:2013-04-23 01:06:23
【问题描述】:

考虑操作removeAll,它从列表中删除所有出现的元素。 该方法返回删除的元素数。

public int removeAll(E element)

为: 1.基于数组的未排序列表

我们不能使用集合。

我现在开始的:

  public int removeAll(T element) {

int duplicatesRemoved = 0;

for (int i = 0; i <= array.length - 1; i++) {
  for (int j = i + 1; j <= array.length - 1; j++) {
    if (array[i] == array[j]) {

    }
  }

我无法完成其余的工作,请帮忙吗?

【问题讨论】:

  • 会以 O(n^2) 结束,这很糟糕。 “Java 2 安全模型”实现实际上就是这样做的。
  • 你想删除一个元素还是元素列表?
  • @NoobUnChained 我想在不使用集合的情况下从基于数组的未排序列表中删除重复元素。我希望它返回我们删除的重复项的数量。
  • 那为什么那个参数T element。抱歉,这让我觉得您想从 List 中删除 element

标签: java


【解决方案1】:

将内容转储到collection of some sort since you're not allowed to use Set,然后取出集合中的内容。

数组(类,而不是原始数组)支持 contains 方法,但您每次都将迭代新集合,使其效率低下。

或者,如果您也不能使用 Array,您可以在原始数组中执行此操作,只需一遍又一遍地寻找重复项。

【讨论】:

  • 不允许使用集合
  • 荒谬的分配。 A Set 确实是正确的答案。但如果你不能这样做,你将不得不使用其他一些集合。
【解决方案2】:

我建议您将重复元素设置为null 之类的内容。删除所有重复项后,通过将末尾的非空元素与中间的空元素交换来压缩数组。

或者,创建一个空数组,并将不重复的元素移动到新数组中。

【讨论】:

  • 问题是我无法前进。我不知道接下来要做什么,这个作业让我很困惑。
  • 您已经在识别重复项,现在您只需要删除它们。将重复元素设置为不在原始数组中的某个值,例如 array[j] = Integer.MIN_VALUE;在您的内部和外部循环中,跳过已设置为 Integer.MIN_VALUE 的数组元素。完成删除重复项后,使用数组末尾的有效元素覆盖所有 Integer.MIN_VALUE 元素,直到所有 MIN_VALUE 元素都位于数组末尾,前面是有效数组元素。
【解决方案3】:

简答

使用地图。

更多答案

这是一个算法,它是功能性的,但可以改进:

创建地图。第二个参数类型随心所欲,我选择了布尔值。
创建一个名为 newArray 的新数组;这将包含唯一值。
遍历数组。对每个项目执行以下操作:

  1. 以当前arrayValue为key,从map中获取storedValue。
  2. 如果 storedValue 为 null(即 Map.get() 返回 null),则这是一个唯一项。将arrayValue、Boolean.TRUE 插入地图并将arrayValue 添加到newArray。
  3. 如果 storedValue 不为 null,则增加重复计数。

遍历列表后,newArray 包含所有非重复项,重复计数包含重复项的计数。

【讨论】:

  • 我不需要返回数组或任何东西。该方法只是删除您要求它搜索的元素的重复项,然后返回它删除的次数。
【解决方案4】:

1.

 /**
 * This method removes all duplicates from an array named "array"
 * using a temporary List. So it converts the array into 
 * something like a Java set
 * 
 * @return int number of duplicates removed
 */
public static int removeAll() {
    int duplicates = 0;
    List<Object> list = new ArrayList<>();
    for(int i=0;i<array.length;i++){
        Object element = array[i];
        if(list.contains(element)) {
            duplicates++;
        }
        else {
            list.add(element);
        }
    }
    array = list.toArray();
    return duplicates;
}

2.

/**
 * This method removes duplicates from an array named "array" using a
 * temporary List.
 * @param elementToBeRemoved
 * @return int number of duplicates removed
 */
public static int removeAll(Object elementToBeRemoved) {
    int duplicates = 0;
    List<Object> list = new ArrayList<>();
    for (int i = 0; i < array.length; i++) {
        Object element = array[i];
        if (list.contains(elementToBeRemoved)) {
            duplicates++;
        } else {
            list.add(element);
        }
    }
    array = list.toArray();
    return duplicates;
}

【讨论】:

  • 我不能使用列表或集合。我需要尽可能地做到这一点。
【解决方案5】:

因为这似乎是作业,没有解释,但这个谜题:

int lengthWithValues = array.length;
for (int i = 0; i < lengthWithValues; i++) {
    // Loop invariant: for all at < i array is sorted, unique and complete.
    int valueToBeChecked = array[i];
    for (int k = i + 1, int j = i + 1; k < lengthWithValues; j++) {
        if (array[j] == valueToBeChecked) {
            --lengthWithValues; // Remove duplicate
        } else {
            array[k] = array[j]; // Maintain differing from all at <= i.
            ++k;
        }
    }
}
duplicatesRemoved = array.length - lengthWithValues;
// array[0 .. length - duplicatesRemoved] is the unique array.
int[] uniqueArray = new int[lengthWithValues];
System.arrayCopy(array, 0, uniqueArray, 0, lengthWithValues);

【讨论】:

  • 兄弟,这不是家庭作业。我只是在做一些修改。
  • @user2272227 我很困惑。这不是家庭作业,但它是一项作业,你不能使用 Sets。
  • @CPerkins 这是我书中的一个问题,我为我的期中考试解决了所有问题。修订。这就是为什么我需要一个正确的工作解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2015-11-24
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2013-07-12
  • 2021-02-25
相关资源
最近更新 更多