Java字符串按字符出现频率的高低进行排序

题目要求

将一个字符串中字符按出现频率的高到低排序返回,如果两个字符出现的频率一样,则将最先出现的字符排在前面
例如:

  • orderChar(“abcdefg”)返回 “abcdefg”
  • orderChar(“abcdefgg”)返回 “gabcdef”
  • orderChar(“abcdefgge”)返回 “egabcdf”

解题代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 把你作业的代码写到这个类里面
 * 不可以修改类的名字、包名、和固有的几个方法名以及方法的可见性
 * 可以增加其他方法、属性、类
 * 可以引用jdk的类
 * 不要引用jdk1.8以外第三方的包
 * 
 * @author ly
 *
 */
public class H {
	public H() {
	} 
	/**
	 * 将一个字符串中字符按出现频率的高到低排序返回,如果两个字符出现的频率一样,则将最先出现的字符排在前面
	 * 例如:orderChar(“abcdefg”)返回 “abcdefg” 
	 * orderChar(“abcdefgg”)返回 “gabcdef”
	 * orderChar(“abcdefgge”)返回 “egabcdf”
	 * @param content
	 * @return
	 */
	public String orderChar(String content) {
//		如果为空则返回空值
		StringBuffer ret= new StringBuffer();
		if(content.length()<=0){
			return ret.toString();
		}
				
		/*用于存储各个字符出现的频率
		 * 此处一定要用LinkedHashMap,否则输出输出顺序将被打乱
		 */
		
		Map<Character,Integer> map = new LinkedHashMap<Character,Integer>();
		for (int i=0;i<content.length();i++){
			map.put(content.charAt(i), map.getOrDefault(content.charAt(i), 0)+1);
		}
		
		/*
		 * map 根据value值排序
		 */
		List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
		
		Collections.sort(list,new Comparator<Entry<Character,Integer>>(){
			@Override
			public int compare(Entry<Character,Integer> arg0,Entry<Character,Integer> arg1){
				return arg1.getValue()-arg0.getValue();
			}
		});
		
		for(Entry<Character,Integer> item:list){
			int count = item.getValue();
			char key = item.getKey();
			ret.append(key);
		}
		
		return ret.toString();
		
	}
	
}

测试代码

public class Test {

	public Test() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {

		H h = new H();
		
		if (h.orderChar("abcdefgg").equals("gabcdef")) {
			// test case 1 ok
			System.out.println("ok1");
		}
		if (h.orderChar("abcdefgge").equals("egabcdf")) {
			// test case 2 ok
			System.out.println("ok2");
		}

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值