简体   繁体   English

计算要显示多少个相同的字母

[英]Calculate how many same letters to display

import java.util.Scanner;

public class abc {
    public static void main(String[] args) {
        char[] ch = str.toCharArray();
        int len = ch.length;

        for (int i = 0; i < len; i++) {
            int counte = 0;
            char c = str.charAt(i);

            for (int j = 0; j < len; j++) {
                if (c == ch[j]) {
                    counte++;
                    ch[j] = '\u0000';
                }
            }

            if (counte > 0) System.out.print(c + "-" + counte + ",");
        }
    }
}

Input:输入:

BBBBBbbbbbbCCooooPPPu BBBBBbbbbbbCCooooPPPu

Output:输出:

5-B,6-b,2-C,4-o,3-P,1-u 5-B,6-b,2-C,4-o,3-P,1-u

But I want the output to be:但我希望输出是:

6-b,5-B,4-o,3-P,2-C,1-u 6-b,5-B,4-o,3-P,2-C,1-u

How can I solve this?我该如何解决这个问题?

Check this example code using classes found in java.util使用 java.util 中的类检查此示例代码

import java.util.*;
import java.text.*;

public class abc {
    public static void main(String[] args) {
        //String as parameter. Should be args[0]; or something?
        String str = "BBBBBbbbbbbCCooooPPPu"; 
        //Format with leading zeros to allow sorting up to 999
        NumberFormat nf = new DecimalFormat("000");

        //Create reverse-sorted set to hold counts
        Set<String> sorted = new TreeSet<String>(Collections.reverseOrder() );
        [...] //Do your thing as before...
            if (counte > 0) {
                //Add to Set (ordered...) using number format
                sorted.add(nf.format(counte) + "-" + c);
            }
        }
        //Join together set to create output String
        StringJoiner sj = new StringJoiner(",");
        for(String s : sorted) {
            //Trim away leading zeros
            sj.add(s.replaceAll("\\G0", ""));
        }
        //Output
        System.out.println(sj.toString());
    }
}

Don't print the values 5-B , 6-b etc.. but store their value in an array and the number of occurrences would be the key :不要打印值5-B6-b等,而是将它们的值存储在一个数组中,出现的次数将是关键:

result[5] = '5-B';
result[6] = '6-b';
// etc...

and finally just inverse this array with some sorting function.最后用一些排序函数反转这个数组。

You need to sort.你需要排序。

The following code do this, never minds if letters are consecutives or not.以下代码执行此操作,不管字母是否连续。

public static void see_string () 
{
    List<Pair<Integer,String>> lp=new ArrayList<Pair<Integer,String>>();
    Map<String, Integer> mci=new HashMap<String, Integer>();

    // Populate
    String str="mylongstringtoscanandsomore";
    str="BBBBBbbbbbbCCooooPPPu";

    int size=str.length();

    for (int pos=0;pos<size;pos++)
        {
        String ch=str.substring(pos,pos+1);
        int val=0;
        if (mci.containsKey(ch)) {val=mci.get(ch);}
        val++;
        mci.put(ch, val);
        }

    // map => list
    for (Map.Entry<String, Integer> e : mci.entrySet())
        lp.add(new Pair<Integer,String>(e.getValue(),e.getKey()));

    // SORT
    reverse_sort(lp);

    size=lp.size();

    // See
    for (int pos=0;pos<size;pos++)
        {
        System.out.println(lp.get(pos).getLeft()+"=>"+lp.get(pos).getRight());
        }

}

// http://stackoverflow.com/questions/521171/a-java-collection-of-value-pairs-tuples

public class Pair<L,R> implements java.io.Serializable  {

      private final L left;
      private final R right;

      public Pair(L left, R right) {
        this.left = left;
        this.right = right;
      }

      public L getLeft() { return left; }
      public R getRight() { return right; }

      @Override
      public int hashCode() { return left.hashCode() ^ right.hashCode(); }

      @Override
      public boolean equals(Object o) {
        if (o == null) return false;
        if (!(o instanceof Pair)) return false;
        Pair pairo = (Pair) o;
        return this.left.equals(pairo.getLeft()) &&
               this.right.equals(pairo.getRight());
      }

    }


// T key to sort
static public <T extends Comparable<T>, Object,K extends Object> 
void reverse_sort(List<Pair<T,K>> _list)
{

    class ComparaterTK <T extends Comparable<T>,K> implements Comparator<Pair<T,K>>
    {
      public int compare(Pair<T,K> ob1, Pair<T,K> ob2)
        {
          return ob2.getLeft().compareTo(ob1.getLeft());
      }
    }

    // simple sort
    Collections.sort(_list, new ComparaterTK<T,K>());
}

This is the easiest way of reaching your requirement using lambdas.这是使用 lambda 达到您的要求的最简单方法。

 String string = "BBBBBbbbbbbCCooooPPPu";
 Stream.of(string.split(""))
            .collect(Collectors.groupingBy(s -> s, Collectors.counting()))
            .entrySet().stream().
            sorted((Map.Entry<String, Long> o1, Map.Entry<String, Long> o2) -> o2.getValue().compareTo(o1.getValue())).
            forEachOrdered(e -> System.out.print(e.getValue() + " - " + e.getKey()+", "));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何计算一个列表中有多少个元素相同? - how to calculate efficent how many elements in a list are the same? 有没有办法根据Java中的字符串中有多少个字母来创建相同字符的char数组? - Is there a way to create a char array of the same character based on how many letters there are in a string in Java? 如何计算txt文件中写入的字母数量 - How to calculate the amount of letters written in a txt file 如何检查 java 中的字符串中有多少个字母? - How to check how many letters are in a string in java? 是否可以找到字符串中使用了多少个字母? - Is it possible to find how many letters are used in a string? 计算具有相同属性的两个给定二进制数之间存在多少个X位数为1位的二进制数 - Calculate how many binary numbers with X number of 1 bits exist between two given binary numbers with the same property 如何显示很多图像? - How to display many images? 如何确定两个不同的单词是否具有相同的字母? - How to determine if 2 different words have the same letters? 在同一个窗口中显示多个文本java - Display many text in same windows java 如何控制用户在输入提示中输入多少个字母和数字? - How to control how many letters and numbers the user enters into an input prompt?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM