我有一个文本文件(T1.txt),其中有几个字符串。其中2个相似但区分大小写。我不得不忽略另一个并得到其余的......
例如ABCD,XYZ,pqrs,aBCd。
我使用Set来返回字符串..但是如何忽略副本并只返回一个字符串(ABCD,aBCd)。
public static Set findDuplicates(File inputFile)
{
FileInputStream fis = null;
BufferedInputStream bis = null;
DataInputStream dis = null;
Set<String> set = new HashSet<String>();
ArrayList<String> inpArrayList = new ArrayList<String>();
try{
fis = new FileInputStream(inputFile);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);
while (dis.available() != 0)
{
inpArrayList.add(dis.readLine());
}
for(int i=0; i < inpArrayList.size(); i++)
{
if(!set.contains(inpArrayList.get(i)))
set.add(inpArrayList.get(i));
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(" set" + set);
return set;
}
返回集应仅包含XYZ,pqrs,aBCd或ABCD。但不是两个。
由于 RAMM
答案 0 :(得分:2)
创建哈希映射,使用currentString.toLowerCase()作为键,使用原始字符串作为值。因此,具有不同情况的两个字符串将具有相同的键。存储它时,你使用原始字符串作为值,所以在打印时你不会得到所有小写但是原来的一个。
答案 1 :(得分:2)
您可以使用TreeSet
和String.CASE_INSENSITIVE_ORDER
比较器,我发现它比建议的HashMap解决方案更优雅:
Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
set.add("abc");
set.add("AbC");
set.add("aBc");
set.add("DEF");
System.out.println(set); // => "[abc, DEF]"
请注意,通过此集的迭代将按字典顺序为您提供键。如果你想保留插入顺序,我会像这样维护一个List:
Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
List<String> inOrder = new ArrayList<String>();
// when adding stuff inside your loop:
if (set.add(someString)) { // returns true if it was added to the set
inOrder.add(someString);
}
答案 2 :(得分:1)
inpArrayList.add(dis.readLine().toLowerCase());
添加此行应该有效...
答案 3 :(得分:0)
在将它放入集合之前,您可以使用调用.toLower()的旧技巧。
如果您想将原始案例更改保留为从小写到自然案例的散列映射,则迭代这些值。
答案 4 :(得分:0)
在将每个字符串插入集合之前将其转换为小写字母,然后该集合将为您处理唯一性。
(如果你还需要保留输入的情况(不能接受Abcd的abcd),那么你需要第二套存储小写变体并在第二组使用检查设置决定是否在结果集中添加字符串。原理相同,但还需要再编程一步。)
答案 5 :(得分:0)
在将它们存储在ArrayList结果中之前,只需将字符串以大写形式存储在集合中。
如果无法向集合中添加字符串(因为它已经存在),请不要将其存储在ArrayList中。
答案 6 :(得分:0)
正如上面所说,我本周早些时候做过类似的事情。 您可以执行类似的操作(只需将其调整为您的代码):
HashMap<String, String> set = new HashMap<String, String>();
while(tokenzier.hasMoreTokens())
{
String element = tokenzier.nextToken();
String lowerCaseElement = element.toLowerCase();
if (!set.containsKey(element)
{
set.put(lowerCaseElement, element);
}
}
最后,地图'set'将包含您需要的内容。
答案 7 :(得分:0)
如何使用HashMap(HashMap),键由哈希函数生成。哈希函数将以小写形式返回字符串。
Shash
答案 8 :(得分:0)
如果输出的情况不重要,您可以使用自定义FilterInputStream进行转换。
bis = new BufferedInputStream(fis);
fltis = new LowerCaseInputStream(bis);
dis = new DataInputStream(fltis);
LowerCaseInputStream的一个示例来自here。