我有一个ArrayList,其元素类似于:
[string,has,was,hctam,gnirts,saw,match,sah]
我想删除重复自身的内容,例如字符串和gnirts,并删除其他内容(gnirts)。我如何实现上述目标?
修改:我想重新解释一下这个问题:
给定一个字符串的数组列表,如何删除包含反向字符串的元素? 鉴于以下输入:
[string,has,was,hctam,gnirts,saw,match,sah]
如何达到以下输出:
[string,has,was,match]
答案 0 :(得分:3)
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
答案 1 :(得分:2)
您可以使用comparator对字符进行排序,然后再检查它们是否相等。这意味着compare(“string”,“gnirts”)将返回0.然后在遍历列表时使用此比较器并将匹配元素复制到新列表。
另一个选项(如果你有一个非常大的列表)是创建一个扩展String类的Anagram类。重写hashcode方法,使anagrams生成相同的hashcode,然后使用anagrams的hashmap检查数组列表中的字谜。
答案 2 :(得分:0)
HashSet<String> set = new HashSet<String>();
for (String str : arraylst)
{
set.add(str);
}
ArrayList<String> newlst = new ArrayList<String>();
for (String str : arraylst)
{
if(!set.contains(str))
newlst.add(str);
}
答案 3 :(得分:0)
要删除重复的项目,您可以使用HashMap(),因为密钥代码将由字母的总和使用(因为每个字母都有自己的代码 - 不是两个不同的单词具有相同的有效情况代码数量),以及值 - 这个词。在HashMap中添加新单词时,如果新单词的代码字母数量与HashMap中的某些现有键相同,则具有相同键的单词将替换为新单词。因此,我们得到了HashMap的单词集合而没有重复。
关于底线“字符串”看起来更好“gnirts”的事实。可能是我们无法确定哪个词更好的情况,因此我们已经认为该词的最终形式并不重要 - 事情是没有重复
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);
<强> UPD:强> 1)需要在ANSI
中维护txt文件最初,我在FileReader和BufferedReader
上替换了ScanerString 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);
此外,文件中的所有单词必须用逗号分隔,因为分区通过函数split(“,”)排成单词。 如果您将单词分隔为另一个字符 - 请在以下行中的符号处替换逗号:
String[] listChar = mainList.get(0).split(",");