6

所以,长话短说,我有一个 Java 家庭作业,需要以各种方式操作一个长的 ArrayList 字符串(我们正在做一些事情,比如显示单词的组合,在 ArrayList 中添加和删除,没什么特别的)。我注意到一些提供的 ArrayLists 有重复的条目(并且重复项对于此作业不是必需的),所以我从老师那里得到了通过删除重复条目来清理数据的好方法。这是我想出的:

private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {  

    for (int i = 0 ; i < ListOfStrings.size(); i++) {
        for (int j = i + 1; j < ListOfStrings.size(); j++) {
            //don't start on the same word or you'll eliminate it.
            if ( ListOfStrings.get(i).toString().equalsIgnoreCase( ListOfStrings.get(j).toString() )  ) {
                ListOfStrings.remove(j);//if they are the same, DITCH ONE.
                j = j -1; //removing the word basically changes the index, so swing down one.
            }                                
        }
    }
    return ListOfStrings;
}

这对我的任务来说很好,但我怀疑它在现实世界中是否非常有用。有没有办法在比较过程中忽略空格和特殊字符?一般有没有更清洁的方法来处理这个问题(可能没有嵌套的 For 循环)?还有一个我不知道该问的问题吗?

4

6 回答 6

19

是的。它可以在 1(优雅)行中完成:

List<String> noDups = new ArrayList<String>(new LinkedHashSet<String>(list));

中间Set确保没有重复。选择的LinkedHashSet实现Set是为了保留列表的顺序。


此外,在风格说明上:

  • 使用以小写字母开头的名称命名您的方法和参数
  • 在指定方法签名时总是引用抽象的(ie List)而不是具体的(ie )ArrayList

你的整个方法是:

private static List<String> killDups(List<String> list) {
    return new ArrayList<String>(new LinkedHashSet<String>(list));
}

对于额外的布朗尼点,使该方法具有通用性,因此它适用于任何类型List

private static <T> List<T> killDups(List<T> list) {
    return new ArrayList<T>(new LinkedHashSet<T>(list));
}

如果您想忽略某些字符,我会为此创建一个类并列出这些字符。hashCode()和方法都equals()依赖于HashSets删除重复:

public class MungedString {
    // simplified code
    String s;

    public boolean equals(Object o) {
        // implement how you want to compare them here
    }

    public int hashCode() {
        // keep this consistent with equals()
    }
}

然后

List<MungedString> list;
List<MungedString> noDupList = killDups(list);
于 2012-11-12T01:30:42.187 回答
2

考虑使用Set

对于最简单的情况,即直接比较字符串, usingHashset是您想要做的:

Set<String> mySet = new HashSet<String>();

mySet.addAll(aListWithDuplciatedStrings);

然后,里面的内容mySet将是唯一的字符串集。

对于忽略案例比较,这是我留给你的作业。看TreeSetComparator

于 2012-11-12T01:33:55.080 回答
1

首先,你可以用一个漂亮的单线来做到这一点Set

private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {
    return new ArrayList(new LinkedHashSet(ListOfStrings));
}

这将删除所有重复项。带有循环的第二个选项是将它们添加到一个新的List

private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {
    ArrayList<String> newList = new ArrayList<String>();
    for(String s : ListOfStrings) {
        if(!newList.contains(s)) {
            newList.add(s);
        }
    }
    return newList
}

至于自定义比较。我相信有一套可以让你提供一个比较器,但我现在不记得了。

于 2012-11-12T01:38:12.527 回答
1

您可以使用HashSet而不是 ArrayList。它是一个自动丢弃重复项的容器。确定插入的项目是否是重复项是一个常数时间操作,无论集合有多大。因此,将您的 ArrayList 转换为 HashSet 并返回将删除所有重复项。

缺点是 HashSet 的顺序是不可预测的,因此当维护顺序很重要时,请改用LinkedHashSet(这会慢一些)。

于 2012-11-12T01:32:17.043 回答
0
public static void removeDuplicateString(String input) {
    String value1 = manikandan;
    String value2 = manikandan;
    String finalValue = "";
    int count = 0;
    char char1;
    char char2 = 0;
    for (int i = 0; i < value1.length(); i++) {
        flag = 0;
        char1 = value1.charAt(i);
        for (int j = 0; j < value2.length(); j++) {
            char2 = value2.charAt(j);
            if (char1 == char2) {
                count++;
            }
        }

        if (count > 1) {
            finalValue=finalValue+char1;
            i=i+(count-1);
        } else {
            finalValue = finalValue + char1;
        }
        count = 0;
    }
    System.out.println(finalValue);
}

}

于 2013-09-30T09:40:56.480 回答
0
import java.awt.Toolkit;
import java.util.Scanner;

class duplicate {

 public static void main(String[] args) {  

    Scanner kb = new Scanner(System. in );
    System.out.println("Entre String");
    String string = kb.nextLine();


    int length = string.length();
    if(length < 2) {
        System.out.println(string);
        return;
    }

    System.out.print(string.charAt(0));
    for (int i = 1; i < length; i++) {
        if (string.charAt(i) != string.charAt(i - 1)) {
            System.out.print(string.charAt(i));
          } 
    }
}
}
于 2013-09-30T09:28:45.890 回答