2

私は最初にこの種のことをしていました:

List<String> items = new ArrayList<String>();

Comparator<items> ignoreLeadingThe = new Comparator<items>() {
    public int compare(String a, String b) {
        a = a.replaceAll("(?i(^the\\s+", "");
        b = b.replaceAll("(?i(^the\\s+", "");
        return a.compareToIgnoreCase(b);
    }
};

Collections.sort(items, ignoreLeadingThe);

今私はこれをやっています:

ItemObject[] io = new ItemObject[items.size()];

Comparator<ItemObject> ignoreLeadingThe = new Comparator<ItemObject>() {
    public int compare(ItemObject a, ItemObject b) {
        a.name = a.name.replaceAll("(?i(^the\\s+", "");
        b.name = b.name.replaceAll("(?i(^the\\s+", "");
        return a.name.compareToIgnoreCase(b.name);
    }
};

Arrays.sort(io, ignoreLeadingThe);

私がArrayList上を並べ替えていたとき、それは通常通りに機能しました。「The」を無視し、それに応じてリストを並べ替えました。しかし、それは実際にはリストの出力に影響を与えていませんでした。

ただし、通常のコードArray(文字列ではなくオブジェクトで埋められている)を並べ替えるときの一番下のコードでは、実際には「The」を削除します。たとえば、「TheJoker」は「Joker」になります。

誰かがここで何が悪いのかわかりますか?

4

1 に答える 1

4

コメントで述べたように、

あなたは上書きa.nameしていますb.name。変換された名前に対して個別のローカル変数を宣言し、でそれらを使用しますcompareToIgnoreCase

...または1つの大きな式を使用します。だから、このようなものを試してみてください...

final Comparator<ItemObject> ignoreLeadingThe = new Comparator<ItemObject>() {

  final Pattern pattern = Pattern.compile("(?i(^the\\s+");

  public int compare(final ItemObject a, final ItemObject b) {
    return pattern.matcher(a.name).replaceAll("")
        .compareToIgnoreCase(pattern.matcher(b.name).replaceAll(""));
  }
};
于 2012-08-30T21:46:10.557 に答える