• Java 不区分大小写比较字符串


    在项目中需要实现一个功能,获取数据库表的所有列,比如user表有 [name,age,height]三个字段,在插入insert之前需要判断插入的列是否在表的列字段中,例如需要插入的数据为

    { name:"机哥", age:26, Height:"60kg", salary:"100块"} ,插入之前比较,发现salary不在表中,把salary剔除。然后发现Height也被剔除了,因为不在列中。

    jdk库没有现成的方法(最接近的是contains方法),自己实现了一个,如下:

    public static void main(String[] args) {
            String orignal = "Height";
    
            String[] arry = {"name","age","height"};
    
            if(listContains(Arrays.asList(arry), orignal)){
                System.out.printf("success");
            }
        }
    
        private static boolean listContains(List<String> list, String ele){
            for(String t:list)
            {
                if(t.equalsIgnoreCase(ele))
                    return true;
            }
            return false;
        }

    原来用的是ArrayList.contains()方法,是区分大小写的,contains内部通过indexOf(ele) > 0实现,indexOf代码如下:

    public int indexOf(Object o) {
            if (o == null) {
                for (int i = 0; i < size; i++)
                    if (elementData[i]==null)
                        return i;
            } else {
                for (int i = 0; i < size; i++)
                    if (o.equals(elementData[i])) //equals比较
                        return i;
            }
            return -1;
        }

    然后看下equalsIngoreCase()方法实现

     public boolean equalsIgnoreCase(String anotherString) {
            return (this == anotherString) ? true
                    : (anotherString != null)
                    && (anotherString.value.length == value.length)
                    && regionMatches(true, 0, anotherString, 0, value.length);
        }

    首先比较对象引用相等,然后串长度一样,最后调用regionMatches()方法

    public boolean regionMatches(boolean ignoreCase, int toffset,
                String other, int ooffset, int len) {
            char ta[] = value;
            int to = toffset;
            char pa[] = other.value;
            int po = ooffset;
            // Note: toffset, ooffset, or len might be near -1>>>1.
            if ((ooffset < 0) || (toffset < 0)
                    || (toffset > (long)value.length - len)
                    || (ooffset > (long)other.value.length - len)) {
                return false;
            }
            while (len-- > 0) {
                char c1 = ta[to++];
                char c2 = pa[po++];
                if (c1 == c2) {
                    continue;
                }
                if (ignoreCase) {
                    // If characters don't match but case may be ignored,
                    // try converting both characters to uppercase.
                    // If the results match, then the comparison scan should
                    // continue.
                    char u1 = Character.toUpperCase(c1);
                    char u2 = Character.toUpperCase(c2);
                    if (u1 == u2) {
                        continue;
                    }
                    // Unfortunately, conversion to uppercase does not work properly
                    // for the Georgian alphabet, which has strange rules about case
                    // conversion.  So we need to make one last check before
                    // exiting.
                    if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
                        continue;
                    }
                }
                return false;
            }
            return true;
        }

    regionMatches这个函数有点意思,首先是边界检查,如果不符合规则返回false;

    之后开始字符比较,如果相等,继续比较;如不相等并忽略大小写,都转成大写比较,如果还是不相等,都转成小写比较,最后还是不相等,返回false。

    为什么转成大小比较不相等还不够,还要转成小写的,那是因为有格鲁吉亚字母(Georgian alphabet):大写不等还不一定不等,还需要转小写   比如 ქართული დამწერლობა   哈哈  有意思。

    欢迎关注Java流水账公众号
  • 相关阅读:
    struts2.1.6存在中文乱码的bug
    记Spring下autowire为name时的一个现象
    AOP注解不起作用的debug结果
    占位
    占位
    Hibernate学习小结
    Struts2学习笔记
    金尚网上商城项目第一章小结
    JavaWeb 学习的第一阶段总结
    大话设计模式 笔记——策略模式
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/9305136.html
Copyright © 2020-2023  润新知