【问题标题】:Wrong indexOf in String Array字符串数组中的 indexOf 错误
【发布时间】:2013-04-09 18:56:22
【问题描述】:

我想按第二个字符对字符串数组进行排序,但位置“1”处的字符索引始终为 -1,因此排序不起作用。怎么了?

String[] wordList = outString.toString().split(", ");

for (int i = 0; i < wordList.length; i++) {
    int n =wordList[i].indexOf(wordList.toString().charAt(1));
}

Arrays.sort(wordList, 1,0);

for (String str : wordList) {
    System.out.println(str);
}

【问题讨论】:

  • 第一个循环应该做什么?你想写一个Comparator 并调用Arrays.sort(wordList, yourComparator)

标签: java arrays string sorting


【解决方案1】:

这个wordList.toString().charAt(1) 为您提供了String[]toString() 表示,这可能不是您想要的。

String [] test = new String [] {"a","b","c"};
System.out.println(test.toString());

输出

[Ljava.lang.String;@23fc4bec

如果您使用自定义 Comparator 并允许 Collections.sort() 对您的 wordList 进行排序(首先将其放入 List 之后),您应该会发现按第二个索引进行排序更容易。

另请注意,您的拆分包含一个空格,这可能会导致更多混淆split(", ");

【讨论】:

    【解决方案2】:

    您想为 String 类型编写自定义 Comparator,例如

    Comparator<String> secondLetterComparator = new Comparator<String>() {
      @Override
      public int compare(String a, String b) {
        return Character.compare(a.charAt(1), b.charAt(1));
      }
    };
    String[] wordList = { "apple", "orange", "banana" };
    Arrays.sort(wordList, secondLetterComparator);
    System.out.println(Arrays.asList(wordList));
    

    会输出

    [banana, apple, orange]
    

    如果 Character.compare(char, char) 不可用,因为您还没有使用 Java 7,请改用 compareTo() 中的这一行 - 它的表达性较差,但效果相同:

    return a.charAt(1) - b.charAt(1);
    

    请注意,这两种代码都不能防止null 或少于 2 个字符的字符串。

    【讨论】:

    • 正如 Deepak 所建议的,您几乎总是最好使用Collection——在本例中为List&lt;String&gt;Collections.sort(collection, comparator)
    【解决方案3】:

    在我看来,您正在寻找的是:

    Arrays.sort(T[] a, Comparator<? super T> c) 
    

    您应该创建自己的Comparator 类:

    public class MyComparator implements Comparator<String>
    {
       public int compare(String s1,String s2)
       {
         return s1.charAt(1) - s2.charAt(1);
       }
    }
    

    然后在Arrays.sort内调用MyComaparator的构造函数如下:

    Arrays.sort(wordList,new MyComparator());
    

    【讨论】:

    • 不需要将第二个字符包裹在另一个String.valueOf()中,使用Character.compare(a, b)
    • @PhilippReichart: Character.compare 不存在于 java 6 中。不幸的是,我现在正在使用java 6..
    • 好点!为简洁起见,我仍然建议 return s1.charAt(1) - s2.charAt(1) 在那时 - 这就是 Character.compare 所做的:)
    【解决方案4】:

    您在查找时缺少索引

     wordList.toString().charAt(1)
    

    应该是 wordList[i].toString().charAt(1)

    【讨论】:

    • 这如何帮助按每个单词的第二个字符对wordList 进行排序?
    猜你喜欢
    • 2011-09-09
    • 2011-04-09
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多