0

考虑操作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]) {

    }
  }

我无法完成其余的工作,请问有什么帮助吗?

4

5 回答 5

0

简短的回答

使用地图。

更多答案

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

创建一个地图<T, Boolean>。第二个参数类型是任何你想要的,我选择了布尔值。
创建一个名为 newArray 的新数组;这将包含唯一值。
遍历数组。对于每个项目执行以下操作:

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

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

于 2013-04-22T16:50:35.010 回答
0

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;
}
于 2013-04-22T16:53:58.270 回答
0

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

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

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

于 2013-04-22T16:20:55.620 回答
0

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

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

于 2013-04-22T16:22:11.377 回答
0

由于这似乎是作业,没有解释,但这个难题:

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);
于 2013-04-22T16:29:46.243 回答