从数组中删除重复的字符串?

时间:2013-04-23 17:22:01

标签: java arrays string loops

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

9 个答案:

答案 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);
    }
}
}