1

如何在不使用 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];
  }
}
4

9 回答 9

4

1)我认为您需要使用等于运算符。尝试

if (!wordList[i].equals(wordList[j])){

而不是!=.

2)凯文也是对的。您需要将 t 设置回 false。

3)其他人已经指出的旁注:为了提高效率,您应该从内部循环开始

for (j = i+1; j < wordList.length; j++) {

4) 另一个旁注:您的结果数组仍然太长。如果您不想使用 aList<String>并且可以松开原始数组,您可以使用 Zim-Zam O'Pootertoot 建议的解决方案并将原始重复项设置为空,添加一个计数器来计算有多少空值您分配,使用正确的大小初始化新数组并在第一个数组上循环最后一次,并仅将非空值复制到新数组中。

于 2013-04-23T17:26:00.713 回答
3

如果你被允许使用Lists,你可以定义一个通用的方法来相当容易地做到这一点:

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();
}
于 2013-04-23T17:37:47.723 回答
3

试试这个代码来删除重复词:

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);
于 2013-04-23T17:45:39.743 回答
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))

使用.equalswill 比较它们包含相同的字符串,而不是它们指向字符串的确切引用。

不确定这是否是唯一的问题,从给出的内容中有点不清楚。

于 2013-04-23T17:25:38.130 回答
0

在您的内部循环中,初始化j = i + 1

if(wordlist[i] != null && wordlist[i].equals(worldlist[j])) { wordlist[j] = null; }

...然后在完成删除所有空值后压缩数组

于 2013-04-23T17:27:37.310 回答
0

如何使用列表:

wordList = outString.toString().split(", ");
List<String> finalList = new ArrayList<String>();
for(String val : wordList) {
  if(!finalList.contains(val)) {
    finalList.add(val);
  }
}

然而,一个 Set 会更有效。如果您不能使用 List 或 Set,并且您被迫删除重复项,那么您每次都必须循环遍历数组,这将执行得非常糟糕。

于 2013-04-23T17:28:18.567 回答
0

遍历数组,并存储在辅助索引中int[]List<Integer>使用您的 two 找到的重复项的索引中for

创建一个新数组,其大小等于原始数组减去重复字符串的大小。

遍历您的原始数组,如果索引不在您的辅助列表中,请将其设置为您的新数组。

于 2013-04-23T17:28:21.627 回答
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++;
    }
}
于 2015-10-11T22:51:13.713 回答
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);
    }
}
}
于 2017-02-03T16:07:37.687 回答