Java:重复元素排序

其实很简单的一个题,竟然想了有一个多小时,实在纳闷,为啥Map不能按照value排序(要是可以的话,估计早就解答出来了……),不过也还好,最后还是思索出来了.下面看题:

一个有N个元素的集合,其中有相同元素。
需要得到按重复元素多少排序的新集合。
{“a”,”b”,”c”,”c”,”a”,”c”}
得到
{“c”,”a”,”b”}
有啥好算法?

在没看到后面之前,我以为只是要排序输出字符在数组里面出现了几次。想想就觉得好简单,可是看完后面的。。。。。。才发现完全石化啊!不过每一个难题都是进步呢,加油!

java标志
image-2262

源代码

请在Jdk 1.8 环境下运行!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
 * Created by puruidong on 2015/4/2.
 */
public class TestDemo {
    public static void main(String[] args) {
        String [] arrays = {"a","b","c","c","a","c","dsa","a","d","k","z","r","z","a","bc","r","a","c"};
        /*太懒,直接就list遍历输出吧.*/
        Arrays.asList(showCopyNum(arrays)).forEach((x)->{System.out.println(x);});
        /*
        * 下面是返回回来的数组.
        showCopyNum(arrays);
        */
    }

    /**
         一个有N个元素的集合,其中有相同元素。
         需要得到按重复元素多少排序的新集合。
         {"a","b","c","c","a","c"}
         得到
         {"c","a","b"}
         有啥好算法?


     * @param array 数组.
     * @return
     */
    private static Object[] showCopyNum(String[] array){
        Set<String> set = new HashSet<>();
        Map<String,Integer> maps = new TreeMap<>();
        for (String str:array)
            maps.put(str,(set.add(str)?1:maps.get(str)+1));
        //下面这一句的大意是:取map的value进行排序,然后输出数组并返回,没有了?嗯。没有了..
        return maps.entrySet().stream().sorted(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {return o2.getValue().compareTo(o1.getValue());}}).toArray();
    }
}

Java:代码洁癖

带题

写代码越来越喜欢,越少越好,看着舒服,整齐……把Java越来越写的像Python吗?看起来也不像,毕竟还有那么多的大括号.今晚遇到的这个问题,进一步让人觉得Java1.8的方便了,虽然熟悉用法花了一些时间.不过用起来还是特别好用啊..睡觉.

java标志
image-2260

源代码

注意:需最低Java 1.8 版本运行环境!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * Created by puruidong on 2015/4/9.
 */
public class TestDemo {
    public static void main(String[] args) {
        System.out.println("输入一个数字[默认起始年份是?:");
        int startYear = 1900;//起始年份.
        List<Integer> list = new ArrayList<>();
        chooseYear(startYear, list);//获取所有闰年.
        list.forEach(s -> System.out.print(s + "\t"));
        System.out.println("\n----------上面是所有闰年,下面才开始输入---------长度超过:" + list.size());
        int nu = new Scanner(System.in).nextInt();
        if (nu < list.size())
            System.out.println(list.get(nu));
        else {
            System.out.println("逗比,越界了!!!你自己丢掉了这次机会~");
            System.exit(-1);
        }
    }

    /**
     * 关于闰年的 这个数组中有100个闰年{4,8....},然后做个 输入 ,输入后可以得出 输入的第几个数的闰年是多少
     * *param year
     * @param startYear
     * @return
     */
    private static List<Integer> chooseYear(int startYear, List<Integer> year) {
        for (; startYear < LocalDate.now().getYear(); startYear += 1)
            year.add(startYear);
        Predicate<Integer> yeas = s -> s % 100 == 0 && s % 400 == 0;
        return year.stream().filter(yeas.or(s -> s % 100 != 0 && s % 4 == 0)).collect(Collectors.toList());
    }
}