我实际上是在尝试实现一个链接列表,它使用java来移动列表中的所有现有元音。意思是,给出了一个列表(链接),其中包含每个节点中的字符,我需要按照这样的方式隔离其节点,即通过保持原始顺序将具有元音的所有节点移动到链接列表的末尾。
输出应该是:
original list: w->e->r->s->o->m->a->t
Output needed: w->r->s->m->t->a->e->o
我想在java中实现它。请让我知道这样做的最佳方式(比如不使用任何额外的列表)。任何建议,帮助将非常感激。
答案 0 :(得分: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]
答案 1 :(得分: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;
}
答案 2 :(得分: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);
}
答案 3 :(得分:0)
这实际上与语言无关,但这是一种方法:
按顺序迭代列表,创建一个新列表并从原始列表中删除您遇到的每个元音,并将它们放入新列表中。
最后,只需将新列表附加到原始列表中即可。当您按原样移除元音时,您可以将所有元音移动到列表的末尾。
答案 4 :(得分: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)];