import java.util.*;public class Main{

public static void main(String args[]){
Scanner cin = new Scanner(System.in);
Snode [] character = new Snode [26];
int [] sign = new int [26];

for(int i = 0; i < 26; i ++)
{
character[i].c = (char) ('a' + i);
character[i].count = 0;
sign[i] = 0;
}

String str = cin.next();
int k = cin.nextInt();
char [] ch = str.toCharArray();
int m = 0;

for(int i = 0; i < ch.length; i ++)
{
character[ch[i] - 'a'].count ++;
}

for(int i = 0; i < 26; i ++)
if(character[i].count != 0)
m ++;

Arrays.sort(character, new nodeComparator());

for(int i = 0; i < 26; i ++)
{
if(k >= character[i].count && character[i].count != 0)
{
k -= character[i].count;
sign[character[i].c - 'a'] = -1;
m --;
}
}

if(m == 0) System.out.println("0\n");
else
{
System.out.println(m);

for(int i = 0; i < ch.length; i ++)
if(sign[ch[i] - 'a'] != -1)
System.out.print(ch[i]);
System.out.println();
}

cin.close();
}
}class Snode{
public char c;
public int count;
Snode()
{
this.c = 'a';
this.count = 0;
}
}class nodeComparator implements Comparator<Snode>{ public int compare(Snode o1, Snode o2) {

int differ = o2.count - o1.count;
if(differ == 0) 
return 0;
if(differ < 0)
return -1;
else
return 1;
}

}
运行后出现问题:Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:12)

解决方案 »

  1.   

    character[i].c = (char) ('a' + i);character[i] 没有赋值,默认为 null
    character[i] = new Snode();
    character[i].c = (char) ('a' + i);
      

  2.   

    那么前面的Snode [] character = new Snode [26];起到什么作用?
      

  3.   

    这个声明的作用,character是存在栈中,堆中存放着character[0]~[25]的值,character指向堆中数据。所以它的作用就是设定范围大小
      

  4.   

    Snode [] character = new Snode [26];共有两个对象一个是放在栈中的可以共享的引用对象character,其次就是放在堆中的new Snode [26],堆中的数据都会有一个初始化的过程,堆中的character[0]~[25]对象会自动占有26的null空对象位置,所以当你调用属性的时候就出现了这个空指针
      

  5.   

    楼主你那样是不能将数组中的对象初始化的,加上这句就可以啦
    for (int i = 0; i < 26; i++) {
    character[i] = new Snode();       character[i].c = (char) ('a' + i);
    character[i].count = 0;
    sign[i] = 0;
    }