【问题标题】:String sorted in descending order按降序排序的字符串
【发布时间】:2014-03-17 16:22:15
【问题描述】:

有谁知道如何对字符串进行排序,例如:afacfa 到 aaaffc? (频率降序) 我对编程很陌生,只能想出办法。

String word = (String)jTextField1.getText();
        String indexes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        int[] count = new int[indexes.length()];
        for (int i = 0; i < word.length(); i++) {
            int index = indexes.indexOf(word.charAt(i));

        System.out.println( "" + i + count[2] ) ;
        if (index < 0)
        continue;

    count[index]++;
        }
        for (int i = 0; i < count.length; i++) {
    if (count[i] < 1)
        continue;

    jTextArea1.append(String.format("%s (%d) %s",indexes.charAt(i),count[i],

            new String(new char[count[i]]).replace('\0', '*')));

【问题讨论】:

  • 你的方法有正确的想法。我唯一的建议是考虑声明一个简短的类来保存有关角色的信息,例如static class Frequency { char c; int count; } 并将您的计数存储在这些数组中。让他们根据您的订购规则实现Comparable,您可以使用Arrays.sort()Collections.sort() 进行排序。然后,当您遍历已排序的集合时,由于对象存储了它们的字符,因此很容易创建输出字符串。
  • 顺便说一句,我编辑了您的示例字符串,以便输出看起来也不按字母顺序排列。我认为这让我们所有人都感到困惑。

标签: java string sorting


【解决方案1】:

如果您熟悉哈希映射,则此代码将轻松完成您想要的操作。 hashmap 值是频率计数器,它通过在 hashmap 中找到最大值来打印输出。

import java.util.Arrays;
import java.util.HashMap;

public class FrequencyPrint {
    public static void main(String[] args) {
        String s = "ccrrcdcffcghijk";
        HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
        for (int i = 0; i < s.length(); i++) {
            if (hashMap.containsKey(s.charAt(i))) {
                int value = hashMap.get(s.charAt(i));
                hashMap.put(s.charAt(i), ++value);
            } else {
                hashMap.put(s.charAt(i), 1);
            }
        }

        Character keys[] = Arrays.copyOf(hashMap.keySet().toArray(), hashMap
                .keySet().toArray().length, Character[].class);
        Integer values[] = Arrays.copyOf(hashMap.values().toArray(), hashMap
                .values().toArray().length, Integer[].class);


        for (int i = 0; i < keys.length; i++) {
            int x = FrequencyPrint.findmax(values);
            for (int j = 0; j < values[x]; j++) {
                System.out.print(keys[x]);
            }
            values[x] = 0;
        }

    }

    public static int findmax(Integer values[]) {
        int max = 0;
        for (int i = 0; i < values.length; i++) {
            if (values[i] > values[max]) {
                max = i;
            }
        }
        return max;
    }
}

【讨论】:

  • 私人无效是什么意思?解释一下,以便我正确回答
【解决方案2】:

您的算法还不错,您可以通过使用字符的 ASCII 值直接查找数组并保存 indexOf 步骤来加快速度。

c-'A' 是一个从 0 到 26 的数字,用于大写字符。

目前,如果你的程序碰到任何不在映射数组中的字符,它就会崩溃。

为了解决这个问题,您可以考虑使用从charIntegerMap 来存储计数,在找到它们时将字符添加到计数值为1 的映射键中,将计数递增如果它已经存在,则返回一个。

【讨论】:

    【解决方案3】:
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class MyPrg {
        public static void main(String[] args) {
            String name = "afacfa";
    
            System.out.println("Input Text = " + name);
            System.out.println("Result = " + arrangeCharactersInIncreasingOrderOfFrequency(name));
    
        }
    
        public static String arrangeCharactersInIncreasingOrderOfFrequency(String inputString) {
            String result = "";
            List<String> updatedStringList = new ArrayList<String>();
    
            for (int i = 0; i < inputString.length(); i++) {
                updatedStringList.add(inputString.substring(i, i + 1));
            }
            Collections.sort(updatedStringList);
    
            for (String abc : updatedStringList) {
                result = result.concat(abc);
            }
            return result;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多