如何在不使用流或哈希集的情况下返回非重复字符串数组



我想创建一个具有以下原型的函数:

public static String[] removeDuplicates(String [] strings)

这个函数应该接受一个字符串数组,并返回另一个没有重复字符串的字符串数组。我尽量不使用流或哈希集,因为这应该是一个不那么高级的练习,我应该只使用数组。我还希望分配尽可能少的内存,而不是创建数组的许多副本。我想到的最明显的解决方案就是复制一个数组,如果字符串不存在,我就给它添加字符串。然而,这涉及到对数组进行迭代,看看它是否已经存在,并创建一个新的副本返回,因为我可能分配了比数组占用更多的空间。有更好的方法吗?

如果你不允许流,或集或其他辅助数据结构,那么"显而易见"解就是你能做的一切;但是先对数组进行排序会使它更有效率,因为这样重复项就会一直紧挨着出现。

注意,您需要执行两次传递,首先对不同的元素进行计数,然后将不同的元素放入结果数组。在知道结果数组的长度之前,您将无法分配结果数组。

如何在不使用流的情况下返回非重复字符串数组或hashset

您可以为此目的使用ArrayList。当迭代字符串数组时,只需检查字符串是否已经存在于列表中;如果没有,将其添加到列表中。最后,将列表转换为数组并返回相同的数组。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(Arrays.toString(removeDuplicates(new String[] { "Hello", "Hi", "Bye", "Hello", "Hi" })));
}
public static String[] removeDuplicates(String[] strings) {
List<String> list = new ArrayList<>();
for (String s : strings) {
if (!list.contains(s)) {
list.add(s);
}
}
return list.toArray(new String[0]);
}
}

输出:

[Hello, Hi, Bye]

如上所述,避免性能差的最佳方法是对数组进行排序并查看相邻的重复项,分两次获得结果数组。下面的内容:

public static String[] removeDuplicates(String[] strings) {
Arrays.sort(strings);
List<String> uniqueStrings = new ArrayList<>();
for (int i = 0; i < strings.length; i++) {
String currentString = strings[i];
uniqueStrings.add(currentString);
i++;
while (i < strings.length && currentString.equals(strings[i])) {
i++;
}
i--;
}
return uniqueStrings.toArray(new String[0]);
}

我假设您必须使用数组而不是列表,映射或任何形式的集合。这里有一个简单的方法。

检查结果数组是否包含当前字符串。如果没有添加,则继续到下一个字符串。然后在最后,将结果复制到自身以消除空值。

String[] a = {"A","E","B","A","C","D","C","E","A"};
int rcount = 0;
String[] result = new String[a.length];
outer:
for (String i : a) {
for (int k = 0; k < rcount; k++) {
if (i.equals(result[k])) {
continue outer;
}
}
result[rcount++] = i;
}
//  now copy only the strings and reduce the size of the array.
result = Arrays.copyOf(result, rcount);
System.out.println(Arrays.toString(result))

打印

[A, E, B, C, D]

相关内容