我有一个List对象(Pin)的List<Pin>,其中Pin类具有以下属性:
String pinNumber, String pinType, Date insertDate
我想获得一个带有HashMap<String pinNumber, int count>,该代码具有不同的pinNumber,告诉我List<Pin>中有多少个不同的pinNumber以及每个计数。

所以我知道的方法是:

  • 遍历List<Pin>
  • 检查HashMap是否已经包含pinNumber的键值,以及:
  • 增加它或添加(如果不存在)。

  • 我想对Pin对象中的每个字段执行相同的操作。

    我确定应该有一个更简单的方法来做到这一点?

    Guava 也许更简单一些?

    最佳答案

    如果您有可能使用Java 8(并且由于您想要做的基本上听起来像是“分组”操作),则可以使用新的Stream API(如用户vallismortis所暗示的)以优雅的方式解决此问题:

    import static java.util.stream.Collectors.counting;
    import static java.util.stream.Collectors.groupingBy;
    
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    public class Main {
    
        public static void main(String[] args) {
            List<Pin> pins = Arrays.asList(
                    new Pin("PIN-1", "T1", new Date()),
                    new Pin("PIN-1", "T2", new Date()),
                    new Pin("PIN-1", "T3", new Date()),
                    new Pin("PIN-2", "T2", new Date()),
                    new Pin("PIN-2", "T2", new Date()),
                    new Pin("PIN-3", "T2", new Date())
    
            );
            Map<String, Long> map = pins.stream().collect(groupingBy(Pin::getPinNumber, counting()));
            System.out.println("map = " + map);
        }
    }
    
    class Pin {
        String pinNumber;
        String pinType;
        Date insertDate;
    
        public Pin(String pinNumber, String pinType, Date insertDate) {
            this.pinNumber = pinNumber;
            this.pinType = pinType;
            this.insertDate = insertDate;
        }
    
        public String getPinNumber() {
            return pinNumber;
        }
    
        public String getPinType() {
            return pinType;
        }
    
        public Date getInsertDate() {
            return insertDate;
        }
    }
    

    输出:
    map = {PIN-1=3, PIN-3=1, PIN-2=2}
    

    10-07 11:59