我用了一个很笨的方法实现了要求,各位高手帮我看看怎么改进效率才能更好呢
其实最关键的问题就是按value值排序之后怎么能对应上它在hashmap中的key。
要求用Hashmap的
//读取一行字符串,判定各个字符出现的次数。并按出现次数由大到小排序。
import java.util.*;
import java.io.*;
public class Testdebug {
public static void main(String[] args) throws Exception{
System.out.println("请输入:");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s;
s=br.readLine();
char[] str=new char[s.length()];
str=s.toCharArray();
Vector v=new Vector(); //定义vector是为了使用Collections.frequency
for(int i=0;i<s.length();i++){ //将输入的字符存入vector
v.add(str[i]);
}
HashMap map=new HashMap();
Iterator i=v.iterator();
while(i.hasNext())
{
Character ch=(Character)i.next();
int f=Collections.frequency(v, ch);
map.put(ch,f);
}
int[] val=new int[s.length()]; //
char[] k=new char[s.length()]; //
int n=0; //
Set set=map.keySet();
Iterator m=set.iterator();
while(m.hasNext())
{
Object key=m.next();
k[n]=(Character)key; //把key值存入字符数组k
Object value=map.get(key);
val[n]=(Integer)value; //把value值存入整数组val
System.out.println(" "+key+"="+value);
n++;
}
char temp1;
int temp2;
for(int p=0;p<=n-2;p++){ //冒泡排序
for(int q=0;q<=n-1-p;q++){
if(val[q]<val[q+1]){
temp2=val[q];temp1=k[q];
val[q]=val[q+1];k[q]=k[q+1];
val[q+1]=temp2;k[q+1]=temp1;
}
}
}
for(int x=0;x<n;x++){
System.out.println(k[x]+"="+val[x]);
}
}
}
其实最关键的问题就是按value值排序之后怎么能对应上它在hashmap中的key。
要求用Hashmap的
//读取一行字符串,判定各个字符出现的次数。并按出现次数由大到小排序。
import java.util.*;
import java.io.*;
public class Testdebug {
public static void main(String[] args) throws Exception{
System.out.println("请输入:");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s;
s=br.readLine();
char[] str=new char[s.length()];
str=s.toCharArray();
Vector v=new Vector(); //定义vector是为了使用Collections.frequency
for(int i=0;i<s.length();i++){ //将输入的字符存入vector
v.add(str[i]);
}
HashMap map=new HashMap();
Iterator i=v.iterator();
while(i.hasNext())
{
Character ch=(Character)i.next();
int f=Collections.frequency(v, ch);
map.put(ch,f);
}
int[] val=new int[s.length()]; //
char[] k=new char[s.length()]; //
int n=0; //
Set set=map.keySet();
Iterator m=set.iterator();
while(m.hasNext())
{
Object key=m.next();
k[n]=(Character)key; //把key值存入字符数组k
Object value=map.get(key);
val[n]=(Integer)value; //把value值存入整数组val
System.out.println(" "+key+"="+value);
n++;
}
char temp1;
int temp2;
for(int p=0;p<=n-2;p++){ //冒泡排序
for(int q=0;q<=n-1-p;q++){
if(val[q]<val[q+1]){
temp2=val[q];temp1=k[q];
val[q]=val[q+1];k[q]=k[q+1];
val[q+1]=temp2;k[q+1]=temp1;
}
}
}
for(int x=0;x<n;x++){
System.out.println(k[x]+"="+val[x]);
}
}
}
map中的hash函数好像和元素的位置没有多大关系
对颠倒后的key(即原来的value)排序 要找原来的key直接通过get方法
对于相同的value 可另行对key做添加标记处理
一会儿给你个算法,没有必要用Map这种数据结构,因为Map里的Value不值得去排序。
这个int数组高16位放char的值,后16位放频率值
1)初始化char的值, 对int数组中依高16为的赋值为0到65536
for (int i = 0; i < 65536; i++)
{
a[i] = (i << 16 & 0xffff);
}
2)得到输入字符串,计算字符频率
for (int i = 0; i < inputstr.length; i++)
{
a[inputstr.charAt[i]] += 1;
}
3)对数组按照后16位进行排序 (具体算法看你选择了)
比如:
package test1;import java.util.*;
public class csdntest1{
public static void main(String[] args){
List list = new ArrayList();
list.add("3");
list.add("4");
list.add("2");
list.add("5");
list.add("4");
Collections.sort(list,new Comparatorsort());
for(int i = 0;i < list.size();i++){
System.out.println(list.get(i));
}
}
} class Comparatorsort implements Comparator{
public int compare(Object o1,Object o2)
{
String str1=(String)o1;
String str2=(String)o2;
if(str1.compareTo(str2)>0)
return -1;
if(str1.compareTo(str2)<0)
return 1;
return 0;
}
}
只不过是次数要由int转换为String,反正也是个排序,这点应该没有关系.
不过可以间接的通过list来排序:
LinkedList list=new LinkedList();
list.addAll(map.values());
java.util.Collections.sort(list);
其实面向对象就是要设计对象。可以把<Character, int>设计成一个对象,然后实现Comparator接口。排序通过TreeSet来排。这个是编程上简单的做法。
如果你需要算法上快速,其实HashMap、TreeSet、String.toCharAtrray都会有性能消耗,这些操作的复杂度不能单独看成1。所以还是用基本排序的算法排序可能更加可以控制复杂度。
对颠倒后的key(即原来的value)排序 要找原来的key直接通过get方法
对于相同的value 可另行对key做添加标记处理
[/Quote]
如何颠倒 value可以重复,但key不允许重复你怎么颠倒啊
我一开始也是这么做的,但是问题是 value排序出来了,怎么找到它对应的key值呢?
就像点名,只要人在,你喊名字,马上就有人喊“到”。