java中的字符串比较

java中的字符串比较,java,Java,我有一个ArrayList,其中包含如下元素: [string,has,was,hctam,gnirts,saw,match,sah] 我想删除那些重复自身的,比如string和gnirts,并删除另一个(gnirts)。我如何着手实现上述目标 编辑:我想重新表述这个问题: 给定一个字符串数组列表,如何删除包含反向字符串的元素? 考虑到以下输入: [string,has,was,hctam,gnirts,saw,match,sah] 如何达到以下输出: [string,has,was,mat

我有一个ArrayList,其中包含如下元素:

[string,has,was,hctam,gnirts,saw,match,sah]
我想删除那些重复自身的,比如string和gnirts,并删除另一个(gnirts)。我如何着手实现上述目标

编辑:我想重新表述这个问题:

给定一个字符串数组列表,如何删除包含反向字符串的元素? 考虑到以下输入:

[string,has,was,hctam,gnirts,saw,match,sah]
如何达到以下输出:

[string,has,was,match]
HashSet=newhashset();
for(字符串str:arraylst)
{
set.add(str);
}
ArrayList newlst=新的ArrayList();
for(字符串str:arraylst)
{
如果(!set.contains(str))
新增(str);
}
在检查字符是否相等之前,您可以使用对字符进行排序的。这意味着compare(“string”、“gnirts”)将返回0。然后在遍历列表时使用这个比较器,并将匹配的元素复制到新列表中

另一个选项(如果您有一个非常大的列表)是创建一个扩展String类的Anagram类。重写hashcode方法,使字谜产生相同的hashcode,然后使用字谜的hashmap检查数组列表中的字谜。

Set result=new HashSet();
Set<String> result = new HashSet<String>();
for(String word: words) {
    if(result.contains(word) || result.contains(new StringBuffer(word).reverse().toString())) {
        continue;
    }
    result.add(word);
}
// result
for(字符串字:字){ if(result.contains(word)| result.contains(newstringbuffer(word).reverse().toString())){ 继续; } 结果:添加(word); } //结果
要删除重复项,您可以使用HashMap(),其中,关键代码将由字母的总和使用(因为每个字母都有自己的代码-在两个不同的单词有相同数量的代码数字的情况下,这是无效的),以及值-该单词。在HashMap中添加新词时,如果新词的代码字母数量与HashMap中的某些现有关键字相同,则具有相同关键字的单词将替换为新词。因此,我们得到了单词的HashMap集合,没有重复

关于底线“string”看起来更像“gnits”这一事实。在这种情况下,我们可能无法确定哪个词更好,因此,我们的依据是,这个词的最终形式并不重要——重要的是没有重复

ArrayList<String> mainList = new ArrayList<String>();

        mainList.add("string,has,was,hctam,gnirts,saw,match,sah");

        String[] listChar = mainList.get(0).split(",");

        HashMap <Integer, String> hm = new HashMap<Integer, String>();

        for (String temp : listChar) {
            int sumStr=0;
            for (int i=0; i<temp.length(); i++)
                sumStr += temp.charAt(i);
            hm.put(sumStr, temp);
        }

        mainList=new ArrayList<String>();

        Set<Map.Entry<Integer, String>> set = hm.entrySet();

        for (Map.Entry<Integer, String> temp : set) {
            mainList.add(temp.getValue());
        }

        System.out.println(mainList);
此外,文件中的所有字必须用逗号分隔,因为分区ishonoy行通过函数split(“,”)划分为字。 如果单词由另一个字符分隔-请在下一行的符号处替换逗号:

String[] listChar = mainList.get(0).split(",");


至少先尝试一下。然后,我们将帮助您参考字谜来更好地表达这个问题。您的问题的措辞和您实际想要的是完全不同的。如果输出是
[gnits,sah,saw,hctam]
,则如何?将不会维护列表顺序。“我想从这个数组列表中删除重复的内容,只保留第一次出现的内容”意味着“保持非重复元素有序”,我想。尤里布,当我按照你的建议做的时候,我的集合中仍然有“重复项”(“字符串”,“gnits”)。@Thilo OP没有提到第一次出现的情况,我不知道你引用的是谁。各位,我想我没有正确地解释我的问题:我已经在编辑中重新措辞了。事实上,正如Greenmart上面提到的,你也可以创建一个集合,让集合检查重复项。我想这个哈希代码的一个很好的候选者是:看字符串及其反面,然后取按字母顺序排序时最先出现的哈希代码。在他对原始问题的一个评论中,芬巴尔:当我试图实现你的代码时,我得到一个编译错误:“)”应该是if(result.contains(word)| | result.contains(new StringBuffer(word.reverse().toString()){^1还有一个错误,你能解释一下管道操作符在这里做什么吗?(对不起,这里是Java新手).严肃的问题:您是否曾经通过阅读错误消息并试图理解它来修复编译器错误?您是否理解所有提供给您的代码?您至少应该能够自己平衡括号。至于运算符,如果我将“java运算符"进入谷歌,我得到的第一个结果是,它将
|
识别为逻辑OR。谢谢Finnbar。我应该得到这个。我已经挣扎了大约一个小时,但我的大脑刚刚关闭。再次抱歉,谢谢你的回答。嗨,Torch:我完全理解你所说的,这是有意义的。所以一个基本上得到了“字符串”的总和并对其进行比较。得到了。但是,当我尝试实现它时,我得到了奇怪的结果:即只比较了第一个元素。代码在dpaste上:问题在第25行,我可以“得到”只有第0个元素。我如何指定对ArrayList中的所有元素执行此操作?循环是唯一的选项吗?在注释UPD中回答您的问题
String fileRStr = new String();
String stringTemp;

FileReader fileR = new FileReader("text.txt");
BufferedReader streamIn = new BufferedReader(fileR);
while ((stringTemp = streamIn.readLine()) != null)
    fileRStr += stringTemp;
fileR.close();

mainList.add(fileRStr);
String[] listChar = mainList.get(0).split(",");