繁体   English   中英

如何在JAVA中找到区分大小写的字符串并忽略它

[英]How to find a string which is case-sensitive and ignore it in JAVA

我有一个文本文件(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。 但不是两者兼而有之。

谢谢拉姆

创建一个哈希映射,使用currentString.toLowerCase()作为键,并使用原始字符串作为值。 这样,两个大小写不同的字符串将具有相同的键。 在存储它时,您使用原始字符串作为值,因此在打印时,您不会得到全部小写字母,而是得到其中的一个。

您可以使用TreeSetString.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);
}
inpArrayList.add(dis.readLine().toLowerCase());

添加此行应该工作...

您可以在调用.toLower()之前使用它的老技巧。

并且,如果您希望将原始大小写更改为从小写到自然大小写的哈希表,则可以迭代这些值。

将每个字符串转换为小写,然后再将其插入到集合中,然后集合将为您处理唯一性。

(如果还需要保留输入的大小写(不接受AbCd返回abcd),则需要第二个存储小写变体的集合,并使用对第二个集合的检查来决定是否向其中添加字符串结果集。原理相同,但要编程的又一步。)

只需将字符串以大写形式存储在您的集合中,然后再将它们存储在ArrayList结果中即可。

如果您不能将字符串添加到集合中(因为它已经存在),请不要将其存储在ArrayList中。

就像上面说的,本周初我做了类似的事情。 您可以执行以下操作(只需将其调整为您的代码即可):

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

最后,地图“集合”将包含您需要的内容。

如何使用HashMap(HashMap),并使用您的哈希函数生成密钥。 哈希函数将以小写形式返回字符串。

词shash

如果输出的大小写不重要,则可以使用自定义FilterInputStream进行转换。

    bis = new BufferedInputStream(fis);
    fltis = new LowerCaseInputStream(bis);
    dis = new DataInputStream(fltis);

LowerCaseInputStream的示例来自此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM