Java初学者,所以请忍受可能有些愚蠢的问题。
我有一个包含多个重复项的字符串列表,我想检测并删除这些重复项。我知道使用HashSet有一种简单的方法可以做到这一点,我实际上已经让它像这样工作了。但最初我试图以另一种方式做到这一点,也很简单,其中有一些错误,我不明白它是什么。
给定一个包含一个副本的字符串数组,比如{“A”,“B”,“C”,“A”},我可以检测并替换副本(此处为“A”)。但是如果我有一个包含多个重复项的字符串数组,比如{“A”,“B”,“C”,“A”,“E”,“A”},那么我的方法“replaceDuplicate”中的循环出错了()”。
我需要帮助以了解以下代码中的问题所在:
public class TryTask_B2_Vector {
public static void main(String[] args) {
// Create array of strings for all the 'Gars':
String[] garList = new String[] {"A", "B", "C", "A", "E", "A"};
// Display the original "ArrayList" of 'Gars':
System.out.println("Original list of Gars: " + garList);
System.out.println();
bruteForce(garList);
System.out.println(bruteForce(garList));
System.out.println();
replaceDuplicate(garList);
System.out.println();
bruteForce(garList);
System.out.println(bruteForce(garList));
System.out.println();
System.out.println("New list of Gars: " + garList);
}
public static boolean bruteForce(String[] input){
for(int i=0; i < input.length; i++){
for(int j=0; j < input.length; j++){
if(input[i].equals(input[j]) && i != j){
return true;
}
}
}
return false;
}
public static String[] replaceDuplicate(String[] input){
for(int i=0; i < input.length; i++){
for(int j=0; j < input.length; j++){
if(input[i].equals(input[j]) && i != j){
input[j] = input[j].replace(input[j], "null");
System.out.println(input[j]);
}
}
}
return input;
}
}
答案 0 :(得分:2)
该程序工作正常,它用String“null”替换重复项。因此{ "A", "B", "C", "A", "E", "A" }
的输出为[A, B, C, null, E, null]
。打印输出语句中有两个令人困惑的位。一个第二个bruteForce()
方法仍然返回true,表示仍然存在重复。实际上,这个重复的值是字符串“null”。其次是多个空打印输出。在replaceDuplicate()
中,您首先将值设置为“null”,然后执行始终打印为null的打印。
另一点。 j
的内部循环不需要从0开始。我们只需要查看重复项的内容。所以它可以从(i + 1)for (int j = i+1; j < input.length; j++)
开始。保存一些额外的循环,你可以避免i != j
检查。
修改你的程序,如
import java.util.Arrays;
public class TryTask_B2_Vector {
public static void main(String[] args) {
// Create array of strings for all the 'Gars':
String[] garList = new String[] { "A", "B", "C", "A", "E", "A" };
// Display the original "ArrayList" of 'Gars':
System.out.println("Original list of Gars: " + Arrays.toString(garList));
System.out.println();
bruteForce(garList);
System.out.println("Has duplicates : " + bruteForce(garList));
System.out.println();
replaceDuplicate(garList);
System.out.println();
bruteForce(garList);
System.out.println("Has duplicates : " + bruteForce(garList));
System.out.println();
System.out.println("New list of Gars: " + Arrays.toString(garList));
}
public static boolean bruteForce(String[] input) {
for (int i = 0; i < input.length; i++) {
for (int j = i+1; j < input.length; j++) {
if (!"null".equals(input[i]) && input[i].equals(input[j])) {
return true;
}
}
}
return false;
}
public static String[] replaceDuplicate(String[] input) {
for (int i = 0; i < input.length; i++) {
for (int j = i+1; j < input.length; j++) {
if (!"null".equals(input[i]) && input[i].equals(input[j])) {
System.out.println("Duplicate found : " + input[j]);
input[j] = input[j].replace(input[j], "null");
}
}
}
return input;
}
}
答案 1 :(得分:1)
问题出在您的bruteforce
方法中。在删除所有重复项后,您希望它返回false
,但事实并非如此。您的replace method
工作正常,并将字符串null
放在重复项A出现的位置。它会放入多个String null
(每个额外一个&#39; A&#39;),因此您的暴力方法仍然会看到重复项并仍然返回true
。只需添加
if(!input[i].equals("null"))
对你的暴力方法而言应该没问题
答案 2 :(得分:1)
可能需要进行一些修改,但是:
@Test
public void test(){
String[] garList = new String[] {"A", "B", "C", "A", "E", "A"};
//remove duplicates
String[] noDup = new String[garList.length];
for(int i =0; i<garList.length; i++){
if(!contains(noDup, garList[i])){
noDup[i] = garList[i];
}
}
System.out.println(Arrays.toString(noDup));
// move nulls to the end
String[] tailNull = new String[garList.length];
int j = 0;
for (int i = 0; i < noDup.length; i++) {
if(noDup[i]!=null){
tailNull[j] = noDup[i];
j++;
}
}
System.out.println(Arrays.toString(tailNull) + "/" + j);
// copy range of not null elements
String[] noNull = new String[j];
System.arraycopy(tailNull, 0, noNull, 0, j);
System.out.println(Arrays.toString(noNull));
}
boolean contains(String[] array, String o){
for (int i = 0; i < array.length; i++) {
if(o.equals(array[i]))
return true;
}
return false;
}
删除重复项和重复的空值。
答案 3 :(得分:0)
通过使用2种方法,我们可以从java..i.e中的列表对象中删除重复的元素 1.通过使用每个 2.使用迭代器 恩。每个使用
ArrayList<String> wordDulicate = new ArrayList<String>();
ArrayList<String> tempList= new ArrayList<String>();
wordDulicate.add("Tom");
wordDulicate.add("Jones");
wordDulicate.add("Sam");
for (String dupWord : wordDulicate) {
if (!tempList.contains(dupWord)) {
tempList.add(dupWord);
}
}
2。通过使用迭代器
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();
Iterator iterator = l1.iterator();
while (iterator.hasNext())
{
YourClass o = (YourClass) iterador.next();
if(!l2.contains(o)) l2.add(o);
}
如果你喜欢这个答案就会打... ...