1

私は実際に、Javaを使用して、リスト内の既存のすべての母音を最後にシフトするリンクリストを実装しようとしていました。つまり、各ノードに文字を含むリスト(リンク)が与えられているので、母音を持つすべてのノードが元の順序を維持してリンクリストの最後に移動するようにノードを分離する必要があります。

出力は次のようになります。

original list: w->e->r->s->o->m->a->t
Output needed: w->r->s->m->t->a->e->o

これをJavaで実装したかったのです。それを行うための最適化された方法を教えてください(余分なリストを使用しないなど)。どんな提案、助けも本当にありがたいです。

4

5 に答える 5

6

試す

    LinkedList<Character> list = new LinkedList<>(Arrays.asList('w', 'e', 'r', 's', 'o', 'm', 'a', 't'));
    int n = list.size();
    for(int i = 0; i < n; i++) {
        char c = list.get(i);
        if ("aeiuoAEIUO".indexOf(c) != -1) {
            list.remove(i);
            list.add(c);
            n--;
        }
    }
    System.out.println(list);

出力

[w, r, s, m, t, e, o, a]
于 2012-12-22T01:19:09.113 に答える
2

このようなことを行うこともできますが、おそらくもっと効果的な方法があります。

private LinkedList reOrder(LinkedList<Character> chars) {
    LinkedList<Character> temporary = new LinkedList<Character>();
    for(Character a: chars) {
        if(a=='a' || a=='e' || a=='i' ||
           a=='y' || a=='u' || a=='o') {
            temporary.add(a);
        }
    }
    chars.removeAll(temporary);
    chars.addAll(temporary);
    return chars;
}
于 2012-12-22T00:59:47.883 に答える
1

カスタムComparatorオブジェクトを定義してから、を使用Collections.sortしてリストを並べ替えます。ここでは、ソートの引数として使用されたときにすべての母音を最後に移動するコンパレータを定義します。

class VowelSort implements Comparator<Character>
{

    private static boolean isVowel(Character c)
    {
        return "AEIOUaeiou".contains(c.toString());
    }

    public int compare(Character arg0, Character arg1)
    {
        final boolean vowel0 = isVowel(arg0), vowel1 = isVowel(arg1);

            //if neither of the characters are vowels, they are "equal" to the sorting algorithm
        if (!vowel0 && !vowel1) 
            {
            return 0;
        }

            //if they are both vowels, compare lexigraphically
        if (vowel0 && vowel1)
            {
            return arg0.compareTo(arg1);
        }

            //vowels are always "greater than" consonants
        if (vowel0 && !vowel1)
            {
            return 1;
        }

            //and obviously consonants are always "less than" vowels
        if (!vowel0 && vowel1)
            {
            return -1;
        }

        return 0; //this should never happen
    }
}

主に...

Collections.sort(chars,new VowelSort());

子音も並べ替えたい場合は、変更するだけです

//if neither of the characters are vowels, they are "equal" to the sorting algorithm
if (!vowel0 && !vowel1)
{
        return 0;
}

//compare consonants lexigraphically
if (!vowel0 && !vowel1)
{
        return arg0.compareTo(arg1);
}
于 2012-12-22T01:44:08.367 に答える
0

これは実際には言語に依存しませんが、ここに1つのアプローチがあります。

リストを1回繰り返し、新しいリストを作成し、遭遇したすべての母音を元のリストから削除して、新しいリストに配置します。

最後に、元のリストに新しいリストを追加するだけです。移動中に母音を削除すると、すべての母音がリストの最後に移動します。

于 2012-12-22T00:46:16.037 に答える
0

独自の抽象データ構造を作成すると、その下にコンテンツをchar配列として格納できます。

char[] word = new char[] { 'f', 'o', 'o', 'b', 'a', 'r' };

char[] reordered = new char[word.length];

int vowel = word.length - 1;
int nonVowel = 0;
for (int i = 0; i < word.length; i++) {
    switch (word[i]) {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        reordered[vowel] = word[i];
        vowel--;
        break;
    default:
        reordered[nonVowel] = word[i];
        nonVowel++;
        break;
    }
}

これで、非母音は正しい順序になりますが、母音は逆の順序になります。ユースケースに応じて、母音のサブオーダーを反転するか、「get(position)」を定義して、次のように返します。

if (position < nonVowel)
            return reordered[position];
        else
            return reordered[reordered.length - (position - vowel)];
于 2012-12-22T02:24:16.623 に答える