删除没有集的基于数组的未排序列表中的重复项

时间:2013-04-22 16:19:36

标签: java

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

    }
  }

我无法完成其他任务,请帮忙吗?

5 个答案:

答案 0 :(得分:0)

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

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

或者,如果你也不能使用数组,你可以在原始数组中完成,只需要一遍又一遍地寻找重复数据。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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);

答案 3 :(得分:0)

简短回答

使用地图。

更多回答

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

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

  1. 使用当前的arrayValue作为键,从地图中获取storedValue。
  2. 如果storedValue为null(即Map.get()返回null)则这是一个唯一项。将arrayValue,Boolean.TRUE插入到地图中,并将arrayValue添加到newArray。
  3. 如果storedValue不为null,则递增重复计数。
  4. 在遍历列表后,newArray包含所有非重复项,重复计数包含重复项计数。

答案 4 :(得分: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;
}