如何在不使用HashSet的情况下从字符串数组中删除重复的字符串?
我尝试使用循环,但不删除。
StringBuffer outString = new StringBuffer("Our, aim, and, isn't, easy, you, you're, actual, and, are, aren't, and, improve, achieving, and, Obviously, and, illumination, are");
wordList = outString.toString().split(", ");
for (i = 0; i < wordList.length; i++) {
for (j = 0; j < wordList.length; j++) {
if((wordList[i]!=wordList[j])&&(j>i)){
t=true;
}
}
if(t==true){
k++;
}
}
String[] wordList1 = new String[k];
wordList = outString.toString().split(", ");
for (i = 0; i < wordList.length; i++) {
(j = 0; j < wordList.length; j++) {
if((wordList[i]!=wordList[j])&&(j>i)){
t=true;
}
}
if(t==true){
wordList1[i]=wordList[i];
}
}
答案 0 :(得分:4)
1) 我认为你需要使用equals运算符。尝试
if (!wordList[i].equals(wordList[j])){
而不是!=
。
2)凯文也是对的。您需要将t设置为false。
3)其他人已经指出的旁注:为了提高效率,你应该用
开始内循环for (j = i+1; j < wordList.length; j++) {
4)另一方面注意:你的结果数组仍然太长。如果您不想使用List<String>
并且可以放弃原始数组,您可以使用Zim-Zam O'Pootertoot建议的解决方案,并将原始副本设置为null,添加计数器
计算您分配的空值的数量,使用正确的大小初始化新数组,并在第一个数组上循环最后一次,并仅将非空值复制到新数组中。
答案 1 :(得分:3)
如果允许您使用List
,则可以定义一种通用方法,可以非常轻松地完成此操作:
public <T> T[] removeDuplicates(final T[] array) {
List<T> noDuplicates = new ArrayList<T>();
for (T arrayElem : array) {
if (!noDuplicates.contains(arrayElem)) {
noDuplicates.add(arrayElem);
}
}
return (T[]) noDuplicates.toArray();
}
答案 2 :(得分:2)
您可能希望在拉出所需的值后将t设置为false:
if(t)
{
wordList1[i]=wordList[i];
t = false;
}
还有:
if((wordList[i]!=wordList[j])&&(j>i))
因为字符串是不可变的,所以总是会返回true(除非你将字符串与你自己的j>i
禁用的确切引用进行比较)。你需要改变它来说出这个:
if (!(wordList[i].equals(wordList[j]))&&(j>i))
使用.equals
将比较它们包含相同的字符串,而不是它们指向字符串的确切引用。
不确定这是否是唯一的问题,从给出的内容中有点不清楚。
答案 3 :(得分:2)
尝试使用此代码删除重复字词:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < wordList.length; i++) {
boolean found = false;
for (int j = i+1; j < wordList.length; j++) {
if (wordList[j].equals(wordList[i])) {
found = true;
break;
}
}
// System.out.printf("Checking: [%s]%n", wordList[i]);
if (!found) {
if (sb.length() > 0)
sb.append(' ');
sb.append(wordList[i]);
}
}
System.out.printf("Unique: [%s]%n", sb);
答案 4 :(得分:0)
在内部循环中,初始化j = i + 1
if(wordlist[i] != null && wordlist[i].equals(worldlist[j])) { wordlist[j] = null; }
...然后在完成删除所有空值
后压缩数组答案 5 :(得分:0)
如何使用List:
wordList = outString.toString().split(", ");
List<String> finalList = new ArrayList<String>();
for(String val : wordList) {
if(!finalList.contains(val)) {
finalList.add(val);
}
}
然而,Set会更有效率。如果你不能使用List或Set,并且你被迫删除重复项,那么你每次都必须遍历数组,这将表现得非常糟糕。
答案 6 :(得分:0)
遍历数组,并在辅助int[]
或List<Integer>
中存储您在两个for
中找到的重复索引。
创建一个新数组,其大小等于原始数组减去重复字符串的大小。
遍历原始数组,如果索引不在辅助列表中,请将其设置为新数组。
答案 7 :(得分:0)
最好也是最有效的方法是假设arr
是包含字符串且可能具有重复值的数组:
Arrays.sort(arr);
int l = 0;
for (int a = 0; a < arr.length; a++) {
if (a == arr.length - 1)
l++;// its a unique value
else if (!(a[a + 1].equals(arr[a])))
l++;// its also a unique
}
String newArray[] = new String[l];
l = 0;
for (int a = 0; a < arr.length; a++) {
if (a == arr.length - 1)
newArray[l] = arr[a];
else if (!(a[a + 1].equals(arr[a]))) {
newArray[l] = arr[a];
l++;
}
}
答案 8 :(得分:0)
试试这个......
public class RemoveDupsStringArray {
public static void main(String[] args) {
String[] withDuplicates = new String[] {"one","one","two","three","one","three","three"};
String[] withoutDuplicates = new String[] {"one","two","three"};
removeDuplicates(withDuplicates);
removeDuplicates(withoutDuplicates);
}
private static void removeDuplicates(String[] array) {
int[] occurence = new int[array.length];
for (int i = 0; i < array.length; i++) {
for(int j=i+1;j<array.length;j++){
if(array[i]==array[j]){
occurence[j]=j;
}
}
}
int resultLength=0;
for(int i=0;i<occurence.length;i++){
if(occurence[i]==0){
resultLength++;
}
}
String[] result=new String[resultLength];
int index=0;int j=0;
for(int i=0;i<occurence.length;i++){
index = occurence[i];
if(index==0){
result[j]= array[i];
j++;
}
}
for(String eachString : result){
System.out.println(eachString);
}
}
}