从数组中删除重复的单词

时间:2014-11-14 20:52:54

标签: java arrays duplicates

我正在尝试从数组中删除重复的单词,并且我一直在获取空值。我不允许使用java排序方法,所以我必须自己开发。这是我的代码:

public class Duplicate{
    public static void main(String[] args){
        String[] test = {"a", "b", "abvc", "abccc", "a", "bbc", "ccc", "abc", "bbc"};
        removeDuplicate(test);
    }
    public static String[] removeDuplicate(String[] words){
        boolean [] isDuplicate = new boolean[words.length];
        int i,j;
        String[] tmp = new String[words.length];

        for (i = 0; i < words.length ; i++){

            if (isDuplicate[i])
                continue;

            for(j = 0; j < words.length ; j++){
                if (words[i].equals(words[j])) {
                    isDuplicate[j] = true;
                    tmp[i] = words[i];
                }
            }
        }
        for(i=0;i<words.length;i++)
            System.out.println(tmp[i]);
        return tmp;
    }
}

我试过

if(words == null)
   words == "";

但它不起作用。我还想以新的大小返回tmp数组。 例如,测试数组长度= 9,删除重复项后,我应该得到一个长度为7的新数组。谢谢你的帮助。 编辑: 结果我得到:

a
b
abvc
abccc
null
bbc
ccc
abc
null

5 个答案:

答案 0 :(得分:1)

您获取空值,因为结果数组包含的字数少于输入数组。但是,您正在构建相同长度的数组。

您不必排序解决此问题。但是,如果您不允许使用java.utils提供的工具,那么这可能是一个设计糟糕的测试问题,或者是任何告诉您不使用Java实用程序类的人都知之甚少。

您可以在不进行排序的情况下解决(假设Java 1.5 +):

public class Duplicate {

    public static void main(String[] args) {
        String[] test = {"a", "b", "abvc", "abccc", "a", "bbc", "ccc", "abc", "bbc"};
        String[] deduped = removeDuplicate(test);
        print(deduped);
    }

    public static String[] removeDuplicate(String[] words) {
        Set<String> wordSet = new LinkedHashSet<String>();
        for (String word : words) {
            wordSet.add(word);
        }
        return wordSet.toArray(new String[wordSet.size()]);
    }

    public static void print(String[] words) {
        for (String word : words) {
            System.out.println(word);
        }
    }
}

输出将是:

a
b
abvc
abccc
bbc
ccc
abc

答案 1 :(得分:0)

我建议采用不同的方法。如果您可以使用ArrayList,为什么不创建其中一个,并向其添加非重复值,如下所示:

ArrayList<String> uniqueArrayList = new ArrayList<String>();
for(int i = 0; i < words.length; i++){
   if(!uniqueArrayList.contains(words[i])){ // If the value isn't in the list already
      uniqueArrayList.add(words[i]);
   }
}

现在,您有一个没有重复项的所有值的数组列表。如果需要,您可以将其转换回常规数组。

修改

我真的认为你应该使用上面的选项,因为没有干净或体面有效的方法只使用数组。但是,如果必须,您可以这样做:

如果它们是重复的,您可以使用您所拥有的代码将值标记为null,并创建一个计数器以查看您拥有的唯一值,例如:

int uniqueCounter = 0;
for(int i = 0; i < isDuplicate.length; i++){
   if(!isDuplicate[i]){
      uniqueCounter++;
   }
}

然后,您可以创建一个包含唯一项目大小的新数组,并循环显示这些单词并添加非重复值。

String[] uniqueArray = new String[uniqueCounter];
int uniqueIndex = 0;
int wordsIndex = 0;
while(index < uniqueArray.length){
   // Check if words index is not a duplicate
   if(!isDuplicate[wordsIndex]){
      // Add to array
      uniqueArray[uniqueIndex] = words[wordsIndex];
      uniqueIndex++; // Need to move to next spot in unique.
   }
   // Need to move to next spot in words
   wordsIndex++;
}

同样,我 HIGHLY 建议不要这样做。这是非常糟糕的,我写的很难,但为了举例说明如何使用数组完成,你可以试试。

答案 2 :(得分:0)

我会去hashset去除重复项,它会删除重复项,因为相同字符串的哈希函数会给出相同的值,并且将删除重复项。然后你可以将它转换为字符串。

答案 3 :(得分:0)

我没有时间编写正常运行的代码,但我建议首先使用Arrays.sort(stringArray)对数组进行排序,然后通过将一个字符串复制到前一个数组来循环。与前一个匹配的字符串是重复的。 注意:此方法可能不是最快的方法,但只应用于小型数组或性能无关紧要的任务。

答案 4 :(得分:-1)

这种做法怎么样?

public static String[] removeDuplicate(String[] words){
    // remember which word is a duplicate
    boolean[] isDuplicate = new boolean[words.length];
    // and count them
    int countDuplicate = 0;
    for (int i = 0; i < words.length ; i++){
        // only check "forward" because "backwards checked" duplicates have been marked yet
        for(int j = i + 1; j < words.length ; j++){
            if (words[i].equals(words[j])) {
                isDuplicate[j] = true;
                countDuplicate++;
            }
        }
    }
    // collect non-duplicate strings
    String[] tmp = new String[words.length - countDuplicate];
    int j = 0;
    for (int i = 0; i < isDuplicate.length; i++) {
        if (isDuplicate[i] == false) {
            tmp[j] = words[i];
            j++;
        }
    }
    // and return them
    return tmp;
}