在 Java 中,是否有一种更优雅的方法可以从 Strings 的 ArrayList 中删除重复的字符串? [英] In Java, is there a more elegant way to remove duplicate strings from and ArrayList of Strings?

查看:28
本文介绍了在 Java 中,是否有一种更优雅的方法可以从 Strings 的 ArrayList 中删除重复的字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So, a long story short, I have a Java homework assignment that requires a long ArrayList of Strings to be manipulated in various ways (we're doing things like showing combinations of words, adding and removing from the ArrayList, nothing too special). I noticed that a few of the provided ArrayLists have duplicate entries (and the duplicates aren't necessary for this assignment), so I got the okay from my teacher to sanitize the data by removing duplicate entries. Here's what I came up with:

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 循环)?还有其他我不知道该问的问题吗?

This is fine for my assignment, but I doubt it would be very useful in the real world. Is there a way to do this that would ignore white space and special characters during the comparison? Is there a cleaner way in general to handle this (maybe without the nested For Loops)? Is there another question I should be asking that I don't know to ask?

推荐答案

是的.只需 1 行(优雅)即可完成:

Yes. And it can be done in just 1 (elegant) line:

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

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

The intermediate Set ensures no duplicates. The LinkedHashSet implementation of Set was chosen to preserve the order of the list.


另外,关于样式说明:


Also, on a style note:

  • 使用以小写字母开头的名称命名方法和参数
  • 在指定方法签名时总是参考抽象(即List)而不是具体的(即ArrayList)
  • name your methods and parameters with names starting with a lowercase letter
  • always refer to the abstract (ie List) rather than the concrete (ie ArrayList) when specifying method signatures

那么你的整个方法是:

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

对于额外的brownie points 使方法通用,因此它适用于任何 List 的类型:

For extra brownie points make the method generic, so it works with any type of List:

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

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

If you wanted to ignore certain characters, I'd create a class for that and have a list of those. Both the hashCode() and the equals() methods are relied upon by HashSets to remove dups:

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

这篇关于在 Java 中,是否有一种更优雅的方法可以从 Strings 的 ArrayList 中删除重复的字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆