简体   繁体   English

如何按每个字符串具有的元音数量按降序对字符串数组进行排序

[英]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.

相关问题 如何按每个字符串中的元音数量按升序对字符串数组进行排序? - How can I sort a string array in ascending order, by number of vowels in each string? 给定数字N和N个字符串数组,请基于每个字符串中的元音数量以降序对字符串进行排序 - Given a number N and an array of N strings, sort the strings based on number of vowels in each of the strings in the descending order 如何按降序对字符串数字进行排序? - How to sort the string number in descending order? 如何使用降序对string的arrayList进行排序 - How to sort an arrayList with string in descending order Java程序根据其权重以降序对字符串数组进行排序 - java program to sort a string array in descending order based upon their weight 如何排序列表<Map<String,String> &gt; 如果 key1 具有相同的值,则按 key1 降序和 key2 升序 - How to sort List<Map<String,String>> by key1 descending order and key2 ascending order if key1 has same values 如何按字符串格式按升序和降序对日期的Arraylist进行排序 - How to Sort an Arraylist of Date in ascending and descending order which is in String format 具有三个元音的字符串的子串数 - Number of substrings of string which has three vowels 将字符串转换为char并按降序排序(ascii) - Converting string to char and sort in descending order (ascii) JAVA降序对JSONObject(String,Int)进行排序 - JAVA Sort JSONObject (String,Int) in descending order
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM