在Java中,是否有更优雅的方法从Strings的ArrayList中删除重复的字符串?

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

private static ArrayList KillDups(ArrayList 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循环)? 还有其他问题我应该问我不知道要问吗?

是。 它可以在1(优雅)线上完成:

 List noDups = new ArrayList(new LinkedHashSet(list)); 

中间Set确保没有重复。 选择SetLinkedHashSet实现以保留列表的顺序。

另外,在样式说明上:

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

那么你的整个方法是:

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

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

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

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

 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 list; List noDupList = killDups(list); 

考虑使用Set

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

 Set mySet = new HashSet(); mySet.addAll(aListWithDuplciatedStrings); 

那么, mySet将是唯一的字符串集。

对于忽略大小写的比较,这是我留给你的作业。 看看TreeSetComparator

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

缺点是HashSet的顺序是不可预测的,所以当维护顺序很重要时,请使用LinkedHashSet (这有点慢)。

首先,您可以使用Set一个漂亮的单行程序:

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

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

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

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

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

}