【问题标题】:java - arraylist check if element exits here ignore the casejava - arraylist 检查元素是否存在这里忽略大小写
【发布时间】:2023-03-26 00:00:02
【问题描述】:

您好,我有一个数组列表,它存储字符串值。我想检查列表中是否存在某些字符串。在这里我想忽略区分大小写。

代码

public static ArrayList< String > arrFoodItems = new ArrayList< String >();

if(arrFoodItems.contains("string"))

        {
            System.out.println("already available in the List.");
        }
        else
        {
            System.out.println("Not available");
        }   

一切正常。但在下面的例子中它失败了。如何在不使用循环的情况下做到这一点。 示例:列表包含:“米饭、鸡肉、...” 现在您正在检查列表中是否存在“大米”。在这种情况下,我们得到“不存在”。

不要使用这个

for(int i=0; i < arrFoodItems.size(); i++)
{

   if(arrFoodItems.get(i)..equalsIgnoreCase(string))
   {
        System.out.println("already available in the List.");
   }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以使用忽略大小写的自定义比较器将所有字符串放在 TreeSet 中:

    List<String> list = Arrays.asList("Chicken", "Duck");
    Set<String> set=  new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    set.addAll(list);
    System.out.println(set.contains("Chicken")); //true
    System.out.println(set.contains("chicken")); //true
    

    对于更复杂的策略/语言环境,您还可以使用 Collat​​or:

    final Collator ignoreCase = Collator.getInstance();
    ignoreCase.setStrength(Collator.SECONDARY);
    
    List<String> list = Arrays.asList("Chicken", "Duck");
    Set<String> set=  new TreeSet<String>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return ignoreCase.compare(o1, o2);
        }
    });
    set.addAll(list);
    System.out.println(set.contains("Chicken"));
    System.out.println(set.contains("chicken"));
    

    【讨论】:

    • String中已经定义了这样一个比较器; String.CASE_INSENSITIVE_ORDER
    • 但是如果列表包含多个空值怎么办。
    • @amicngh 我建议的实现是为了展示一个例子——你显然会在最终版本中添加空检查
    【解决方案2】:

    循环遍历元素是 contains 为你做的,所以如果你不想使用循环,最好不要使用 ArrayList。

    如果不使用其他集合,您最好的选择是使用

    FOUND: {
        for(String item: arrFoodItems) {
           if (item.equalsIgnoreCase(string)) {
              System.out.println(string+" already available in the List.");
              break FOUND;
           }
        }
        System.out.println(string + " not available");
    }   
    

    【讨论】:

      【解决方案3】:

      您可以使用 Collections.binarySearch 静态方法,该方法让您提供比较器(在本例中为 String.CASE_INSENSITIVE_ORDER)

      List<String> list = new ArrayList<String>();
      list.add("Joe");
      Collections.binarySearch(list, "joe", String.CASE_INSENSITIVE_ORDER); // return 0
      

      希望这会有所帮助!

      【解决方案4】:

      为什么不直接写你的CustomArrayList 然后重写contains 方法,如下所示。现在您可以使用CustomArrayList 代替ArrayList

      示例:

      public class CustomArrayList extends ArrayList<String> {
          @Override
          public boolean contains(Object o) {
              String str = (String)o;
              for (String s : this) {
                  if (str.equalsIgnoreCase(s)) return true;
              }
              return false;
          }
      
          @Test
          public static void main(String[] args) {
      
              List<String> myList=new CostumArrayList();
              myList.add("Amit");
      
              System.out.println(myList.contains("AMIT"));
              System.out.println(myList.contains("amit"));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 2015-07-18
        • 2018-09-15
        • 2018-01-11
        • 1970-01-01
        相关资源
        最近更新 更多