【问题标题】:something like equalsIgnoreCase while using indexOf使用 indexOf 时类似 equalsIgnoreCase
【发布时间】:2012-12-11 09:40:29
【问题描述】:

我正在使用此代码来获取数组中字符串的索引。

int n = Arrays.asList(Names).indexOf(textBox.getText());

这里的问题是,如果 textBox 中的字符串在 case 中与它在数组中的相似字符串不同。它返回 -1。在字符串比较的情况下,如何使其类似于 equalsIgnoreCase

谢谢

【问题讨论】:

    标签: java arrays string


    【解决方案1】:

    您可以使用 Collat​​or 类。在这里您可以设置不同的级别进行比较。 您可以忽略大小写,并设置一些特定的语言字符。例如在德语中,它可以设置 ß 等于 ss。

    这里有一些纪录片: Collator class

    编辑:这是给你的示例代码

    private int indexOf(String[] original, String search) {
        Collator collator = Collator.getInstance(); 
        collator.setStrength(Collator.SECONDARY);
        for(int i = 0;i<original.length;++i) {
            if(collator.equals(search, original[i]))
                return i;
        }
        return -1;
    }
    

    【讨论】:

    • 看例子,我希望这就是你要找的
    • 所以现在我真的知道你想要什么了:D 你只需将原始字符串和你在原始字符串中寻找的字符串提供给这个方法,它就会返回你的索引搜索字符串,或 -1
    • 但这是获取给定父字符串中子字符串的索引。我需要从字符串数组中获取字符串的索引。不改变数组中字符串的顺序。
    【解决方案2】:

    您可以使用StringUtils Apache 公共库类或this 如果您不想下载该库,请查看source code 的逻辑来创建方法。使用 StringUtils 的stackoverflow 链接

    如果你想从字符串数组中找到字符串的索引,那么还有另一个库ArrayUtils,它有一个方法indexOf

    这里是 indexOf 的实现

     public static int indexOf(Object[] array, Object objectToFind, int startIndex) {
            if (array == null) {
                return INDEX_NOT_FOUND;
            }
            if (startIndex < 0) {
                startIndex = 0;
            }
            if (objectToFind == null) {
                for (int i = startIndex; i < array.length; i++) {
                    if (array[i] == null) {
                        return i;
                    }
                }
            } else {
                for (int i = startIndex; i < array.length; i++) {
                    if (objectToFind.equals(array[i])) {
                        return i;
                    }
                }
            }
            return INDEX_NOT_FOUND;
        }
    

    因为你可以看到它使用 .equals() 我建议你

    1) 创建自定义字符串类

    2) 将其添加到数组中

    3) 像这样覆盖 .equals 方法

    class StringCustom
    {
    String string;
    //implement getters and setters
    public String equals(Object o)
    {
    return this.getString().equalsIgnoreCase(((String)o).getString());
    }
    }
    

    【讨论】:

    • 但这是获取给定父字符串中子字符串的索引
    • @Archie.bpgc 你还想要什么?
    • 我需要从字符串数组中获取字符串的索引。不改变数组中字符串的顺序
    • @Archie.bpgc :您也可以使用 arrayutils 类。但这不会帮助您解决忽略案例的问题。仍在搜索中...
    • @Archie.bpgc :一种解决方案是创建一个自定义 String 类并覆盖它的 equals 方法。然后使用 ArrayUtils 的 indexOf() ,因为源代码使用 equals 方法
    【解决方案3】:

    另一种方法,在内部确保忽略大小写。

    public static int indexOfIgnoreCase(String[] strs, String text){
    
       int n = strs.length;
       for(int i=0;i<n;i++){
           if(strs[i].equalsIgnoreCase(text))
             return i;
       }
       return -1;
    }
    int n = indexOfIgnoreCase(Names,textBox.getText());
    

    【讨论】:

    • 虽然我将文本框中的字符串更改为大写/小写,但我不知道它在给定数组中的情况。
    • 此外,数组中的字符串被用作自动完成。所以我不能将它们转换为大写/小写(在下拉列表中看起来不太好)。可能必须创建一个所有字符串都为小写/大写的新数组。但这不是最好的方法
    【解决方案4】:

    你可以这样扩展ArrayList

        public class StringArrayList extends ArrayList<String> {
            @Override
            public boolean contains(Object o) {
                String paramStr = (String)o;
                for (String s : this) {
                    if (paramStr.equalsIgnoreCase(s)) return true;
                }
                return false;
            }
    
            public int indexOf(Object o) {
                String paramStr = (String)o;
                int index = 0;
                for (String s : this) {
                    if (paramStr.equalsIgnoreCase(s)) return index;
                    index++;
                }
                return -1;
            }
        }
    

    最终:

    int n = new StringArrayList(Arrays.asList(Names)).indexOf(textBox.getText());
    

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 2012-08-13
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2012-07-21
      • 1970-01-01
      相关资源
      最近更新 更多