Java 如何按每个字符串中的元音数按升序对字符串数组进行排序?

Java 如何按每个字符串中的元音数按升序对字符串数组进行排序?,java,string,sorting,indexoutofboundsexception,Java,String,Sorting,Indexoutofboundsexception,输出: n=4 xyz bad aeiou hello 嗯。。。这可能有点过头了(List和RegEx),但如果您不必执行数百万次,那么通过自定义比较器将它们排序到列表中即可: aeiou hello bad xyz String[]s=新字符串[]{“xyz”、“bad”、“aeiou”、“hello”}; sort,新的比较器(){ @凌驾 公共整数比较(字符串o1、字符串o2){ 返回o2.replaceAll(“[^aeiouAEIOU]”,以及“).length() -o1.rep

输出:

n=4
xyz
bad
aeiou
hello

嗯。。。这可能有点过头了(List和RegEx),但如果您不必执行数百万次,那么通过自定义比较器将它们排序到列表中即可:

aeiou
hello
bad
xyz
String[]s=新字符串[]{“xyz”、“bad”、“aeiou”、“hello”};
sort,新的比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o2.replaceAll(“[^aeiouAEIOU]”,以及“).length()
-o1.replaceAll(“[^aeiouAEIOU]”,“).length();
}
});

编辑:通过删除列表进行优化,谢谢@Holger

好吧。。。这可能有点过头了(List和RegEx),但如果您不必执行数百万次,那么通过自定义比较器将它们排序到列表中即可:

aeiou
hello
bad
xyz
String[]s=新字符串[]{“xyz”、“bad”、“aeiou”、“hello”};
sort,新的比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o2.replaceAll(“[^aeiouAEIOU]”,以及“).length()
-o1.replaceAll(“[^aeiouAEIOU]”,“).length();
}
});

编辑:通过删除列表进行优化,感谢@Holger

类似于mumpitz代码,但针对性能进行了优化:

String[] s = new String[]{"xyz", "bad", "aeiou", "hello"};

Arrays.sort(s, new Comparator<String>(){
    @Override
    public int compare(String o1, String o2) {
        return o2.replaceAll("[^aeiouAEIOU]", "").length()
                - o1.replaceAll("[^aeiouAEIOU]", "").length();
    }
});
类Comp实现比较器{
私有静态布尔值[]Is元音=新布尔值[127];
静止的{
Is元音['a']=true;
Is元音['e']=true;
i元音['i']=true;
i元音['o']=true;
i元音['u']=true;
}
@凌驾
公共整数比较(字符串o1、字符串o2){
返回计数(o1)-计数(o2);
}
私有整数计数(字符串s){
int-cnt=0;

对于(int i=0;i类似于mumpitz代码,但针对性能进行了优化:

String[] s = new String[]{"xyz", "bad", "aeiou", "hello"};

Arrays.sort(s, new Comparator<String>(){
    @Override
    public int compare(String o1, String o2) {
        return o2.replaceAll("[^aeiouAEIOU]", "").length()
                - o1.replaceAll("[^aeiouAEIOU]", "").length();
    }
});
类Comp实现比较器{
私有静态布尔值[]Is元音=新布尔值[127];
静止的{
Is元音['a']=true;
Is元音['e']=true;
i元音['i']=true;
i元音['o']=true;
i元音['u']=true;
}
@凌驾
公共整数比较(字符串o1、字符串o2){
返回计数(o1)-计数(o2);
}
私有整数计数(字符串s){
int-cnt=0;


对于(int i=0;i),您的问题/问题是?错误是什么?“我遇到了错误”-哪个错误?如何根据每个字符串中存在的元音数按字符串数组的升序交换字符串。“ArrayIndexOutOfBoundsException”可能是由i=(s.length-1)时的“s[i+1]”引起的。您的问题/问题是?错误是什么?“我收到一个错误”-哪个错误?如何根据每个字符串中存在的元音数按字符串数组的升序交换字符串。“ArrayIndexOutOfBoundsException”可能是由I=(s.length-1)时的“s[I+1]”引起的。请解释一下字符串o1和o2。@mahesh它们是
比较的方法参数(字符串o1,字符串o2)
他正在使用一个comparator函数,该函数可以有效地遍历一组值中的所有实例,并找出其中哪一个具有最低/最高的值。试试谷歌搜索气泡排序,你就会知道它是如何工作的。虽然这是一个稍微高级的答案,但它是一个非常好的答案。@mahesh the compare()-Comparator的方法决定第一个或第二个给定字符串(o1或o2)在排序顺序中是否“更大”。在这种情况下,两个字符串都减少到只有元音,然后比较它们的长度。如果o1“更小”,则compare()给出负整数“然后是o2,所以我们只是从o2的长度中减去o1的长度。不需要最后的
sList.toArray;
call。您已经将数组排序为
Arrays.asList”
返回了数组的包装。对
sList的每次修改都会修改底层
s
数组。当然,当您仅使用
数组时,sort(s,您的比较器)
,您甚至不需要
数组。asList
…请您解释一下字符串o1和o2。@mahesh它们是
比较(字符串o1,字符串o2)时的方法参数
他正在使用一个comparator函数,该函数可以有效地遍历一组值中的所有实例,并找出其中哪一个具有最低/最高的值。试试谷歌搜索气泡排序,你就会知道它是如何工作的。虽然这是一个稍微高级的答案,但它是一个非常好的答案。@mahesh the compare()-Comparator的方法决定第一个或第二个给定字符串(o1或o2)在排序顺序中是否“更大”。在这种情况下,两个字符串都减少到只有元音,然后比较它们的长度。如果o1为“更小”,则compare()给出负整数然后是o2,所以我们只是从o2的长度中减去o1的长度。不需要最后的
sList.toArray;
调用。您已经将数组排序为
Arrays.asList
返回了数组的包装。对
sList
的每次修改都会修改底层的
s
数组。当然,当您只使用
Arrays.sort(s,您的比较器)
时,您甚至不需要
数组。asList
与mumpitz代码类似,调用
sList.toArray(s);
已过时。请参阅。“与mumpitz代码类似”,调用
sList.toArray;
已过时。请参阅。