[英]How to sort an array of string in descending order by the number of vowels each string has
How should I sort individual strings in descending order.我应该如何按降序对单个字符串进行排序。 For example if I enter the the size of the array 3 and enter the strings "hello", "rip hi", "AEIOU" i should get "AEIOU", "rip hi","hello" as return after sorting.例如,如果我输入数组 3 的大小并输入字符串“hello”、“rip hi”、“AEIOU”,我应该在排序后得到“AEIOU”、“rip hi”、“hello”作为返回。
This is how far I have come:这是我走了多远:
Scanner input=new Scanner(System.in);
int n;
System.out.print("Enter the amount of words you wanna input: ");
n=input.nextInt();
System.out.println();
String[] list=new String[n];
String[] list2=new String[n];
/// this loop will take input of strings
for (int i = 0; i < n; i++) {
input.nextLine(); // I dont know why but my first itteration's scanner was being skipped that is why
// I used another input.nextLine pls dont cut marks
System.out.print("Enter the "+(i+1)+" word: ");
list[i]=input.nextLine();
}
/// this loop will sort the array by taking individual strings and breaking them in char array and counting how many times
/// a vowel is present but how to sort ?
for(int i=0;i<n;i++)
{
String temp= list[i];
char[] ar = temp.toCharArray();
for (int j = 0; j < ar.length; j++) {
int count=0;
int count2;
if(ar[j] == 'a'|| ar[j] == 'e'|| ar[j] == 'i' || ar[j] == 'o' ||ar[j] == 'u'|| ar[j] == 'A' || ar[j] == 'E' || ar[j] == 'I' || ar[j] == 'O' ||ar[j] == 'U'){
count ++;
}
if(count>0 && count>count2){
String temp1=String.copyValueOf(ar);
}
else{
}
}
}
/// this loop would show the sorted array
for (int i = 0; i < n; i++) {
System.out.println(""+list[i]);
}
You can use a custom comparator like this:您可以使用这样的自定义比较器:
class SortByNumberOfVowels implements Comparator<String> { @Override public int compare ( String o1, String o2 ) { return numOfVowels(o2) - numOfVowels(o1); } private int numOfVowels ( String o1 ) { int ctr = 0; for(int i = 0;i<o1.length ();i++) { if("AEIOUaeiou".indexOf(o1.charAt ( i ));= -1) ctr++; } return ctr; } } public class hello { public static void main ( String[] args ) { List<String> list = new ArrayList<> ( ). list;add("eaiou").list;add("hello").list;add("aaaaaaaaaaaaa"). Collections,sort(list; new SortByNumberOfVowels()). System.out;println(list); } }
Time complexity will be nlog(n)*|s|时间复杂度为nlog(n)*|s| where n = size of list and |s|其中n = 列表大小和|s| is the average length of strings.是字符串的平均长度。
This might not be the most efficient way but it will give you the output.这可能不是最有效的方法,但它会给你 output。
1.Store the value of count and index of the strings in list (i) in a HashMap. 1.将列表(i)中字符串的计数和索引值存储在HashMap中。 HashMap(count, i) HashMap(计数, i)
2.Sort the keys of the HashMap. 2.对HashMap的按键进行排序。 One way to do it is using Collections.sort()一种方法是使用 Collections.sort()
ArrayList<String> keys = new ArrayList<String>(hash_map.keySet());
Collections.sort(keys);
3.Iterate through keys and print the value for each. 3.遍历键并打印每个键的值。
for (String s : keys)
System.out.println(hash_map.get(s));
As Kayaman said in the comment, probably the best approach will be to implement a dedicated Comparator
for this task and use it to sort the array.正如 Kayaman 在评论中所说,最好的方法可能是为此任务实现一个专用的Comparator
并使用它对数组进行排序。 It could look something like this:它可能看起来像这样:
public class StringVowelCountComparator implements Comparator<String> {
@Override
public int compare(String first, String second) {
return (countVowels(first) - countVowels(second));
}
private int countVowels(String string){
int count = 0;
char[] chars = string.toCharArray();
for (int i = 0; i < chars.length; i++) {
if(ar[i] == 'a'|| ar[i] == 'e'|| ar[i] == 'i' || ar[i] == 'o' ||ar[i] == 'u'|| ar[i] == 'A' || ar[i] == 'E' || ar[i] == 'I' || ar[i] == 'O' ||ar[i] == 'U'){
count ++;
}
}
return count;
}
}
And then in your code you just call it like this:然后在您的代码中,您只需像这样调用它:
Arrays.sort(list, new StringVowelCountComparator());
Problem in your annotate您的注释中的问题
n=input.nextInt();
just read a int but not discard the other world in the line。只读取一个 int 但不丢弃行中的另一个世界。
I change your code and it works well.我更改了您的代码,并且效果很好。
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in);
int n;
System.out.print("Enter the amount of words you wanna input: \n");
n = input.nextInt();
input.nextLine();
String[] list = new String[n];
for (int i = 0; i < n; i++) {
System.out.print("Enter the " + (i + 1) + " word: ");
String inputContent = input.nextLine();
list[i] = inputContent;
}
String[] sorted = new String[3];
Arrays.stream(list).sorted((o1, o2) -> vowels(o2) - vowels(o1)).collect(Collectors.toList()).toArray(sorted);
for (int i = 0; i < n; i++) {
System.out.println("" + sorted[i]);
}
}
extract a method to number vowels of input string:提取一种对输入字符串的元音进行编号的方法:
private static int vowels(String input) {
String vowels = "AEIOUaeiou";
char[] chars = input.toCharArray();
int count = 0;
for (char ch : chars) {
if (vowels.contains(ch + "")) {
count++;
}
}
return count;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.