我正在尝试从数组中删除重复的单词,并且我一直在获取空值。我不允许使用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
答案 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;
}