对象排序并去重——一道笔试题

题目要求

输入一行数据,格式如下:

 (abc,1),(123,2),(ddd,1),(abc,1)

每一组数据(String, int)形式,左边为字符串,右边为优先级,将这一行数据按优先级从大到小排列,并且过滤掉字符串与优先级相同的数据, 相同优先级、字符串不同的按先后顺序显示,排列后结果如下:

(123,2),(abc,1),(ddd,1)

分析题意

我最开始的想法是:

  1. 用正则表达式将字符串中的键值对提取出来;
  2. 将提取出来的键值对放到List<Map>中;
  3. 遍历List进行排序;

但是真正开始写的时候第一步就卡住了,写出来的正则表达式只能提取最左边左括号到最右边右括号的内容,就是一整个字符串全给提取出来了,卡了半小时没办法,放弃了正则表达式的做法,改成了遍历 + split() 的方法。

拆分之后仔细想想,建一个实体类并且实现Comparable接口好像更简便一些,同时重写 hashCode() 方法和 equals() 方法再利用 Set 还能达到去重的效果,可以满足题目的要求。

代码实现

感觉代码有点又臭又长,明天再看下网上有没有这个题目,看看更标准的答案。

package com.test;

import java.util.*;

/**
 * @author :  [email protected]
 * @create :  10-27-2020 21:15:13
 * @description :  按优先级排序并去重
 * @since :  v1.0
 */
public class MediumMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            List<Entity> list = sort(line);
            System.out.println(list);
        }
    }

    private static List<Entity> sort(String inputLine) {
        String[] split1 = inputLine.split("\\),\\(");
        Set<Entity> set = new HashSet<>();
        for (int i = 0; i < split1.length; i++) {
            String[] split2 = split1[i].split(",");
            String str;
            int priority;
            if (i == 0) {
                str = split2[0].substring(1);
            } else {
                str = split2[0];
            }
            if (i == split1.length - 1) {
                priority = Integer.parseInt(split2[1].split("\\)")[0]);
            } else {
                priority = Integer.parseInt(split2[1]);
            }
            Entity entity = new Entity(str, priority);
            set.add(entity);
        }
        List<Entity> list = new ArrayList<>(set);
        list.sort(Comparator.naturalOrder());
        return list;
    }
}

class Entity implements Comparable<Entity> {
    private String str;
    private Integer priority;

    public Entity(String str, Integer priority) {
        this.str = str;
        this.priority = priority;
    }

    // getter and setter
    
    @Override
    public int hashCode() {
        return str.hashCode() * priority.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        } else if (this == obj) {
            return true;
        } else if (obj instanceof Entity) {
            Entity entity = (Entity) obj;
            return entity.getPriority() == this.getPriority() && entity.getStr().equals(this.getStr());
        }
        return false;
    }

    @Override
    public int compareTo(Entity entity) {
        if (this.getPriority() > entity.getPriority()) {
            return 1;
        } else if (this.getPriority() < entity.getPriority()) {
            return -1;
        } else {
            return this.getStr().compareTo(entity.getStr());
        }
    }
}