首页 > 解决方案 > Java中重复数据的反击

问题描述

我有java的问题。在简历中,它将按名称显示用户列表(从 .json 文件中提取),但我必须为所有用户添加后缀 00,从而留下:'name+00'。这样,如果有 2 个用户同名,那么程序应该通过增加后缀来区分他们。例如,如果两个用户名为“John”,则名称应如下所示:“John00”和“John01”。

这是我所做的总结:

班级用户:

public class User{

    private String name;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

班级资料:

private HashMap<String, List<User>> readUsers() {
    HashMap<String, List<User>> usuarios= new HashMap<>();

    SimpleFeatureCollection collection = datastore.getFeatureCollection();

    try (SimpleFeatureIterator itrusuarios = collection.features()) {

        int contador=0;
        while (itrusuarios.hasNext()) {

            SimpleFeature simpleFeature = itrusuarios.next();
            User usuario = new User();

           usuario.setName(simpleFeature.getID()+contador); //This don't work
            contador++;

            System.out.println(usuario.getName);
        }

    } finally {
        datastore.dispose();
    }


    return usuarios;
}

如果我尝试将计数器添加到用户的名称(在 Data 类中),它不会正常工作,因为它向我显示了整个用户列表,并且它添加了一个自增的数字:Rose1,约翰2,约翰3,丹4,安娜5...

如果我用计数器修改 User 类的设置器this.name = name+counter:然后看起来像这样:Rose0,John0,John0,Dan0,Anna0...

我正在寻找的输出是:

玫瑰00,约翰00,约翰01,丹00,安娜00...

也就是说,当你找到相同的名字时,只增加那个名字。

谢谢!

标签: java

解决方案


您需要将地图更改为Map<String, Integer>. 您基本上将拥有一个按名称访问的计数器映射。

当您请求创建新用户时,您检查地图以查看当前计数器值设置为什么。每次遇到名称时,都会增加关联的名称键。

无需将名称映射存储到用户列表中,因为没有必要通过不断增加的值来“识别”(识别)他们。

tl;dr:只需使用一个名称出现映射,它会根据它们的外观而增加。

import java.util.*;
import java.util.stream.Collectors;

public class NameGenerator {
    private static Map<String, Integer> nameOccuranceMap = new HashMap<String, Integer>();

    public static void main(String[] args) {
        List<User> users = new ArrayList<User>();

        for (String name : Arrays.asList("Rose", "John", "John", "Dan", "Anna")) {
            if (nameOccuranceMap.containsKey(name)) {
                nameOccuranceMap.put(name, nameOccuranceMap.get(name) + 1);
            } else {
                nameOccuranceMap.put(name, 0);
            }
            users.add(new User(String.format("%02d%s", nameOccuranceMap.get(name), name)));
        }

        System.out.println(users.stream().map(User::getName).collect(Collectors.joining(", ")));
    }

    private static class User {
        private String name;
        public String getName() { return name; }
        public User(String name) { this.name = name; }
        @Override public String toString() { return String.format("User [name=%s]", name); }
    }
}

输出: 00Rose, 00John, 01John, 00Dan, 00Anna


推荐阅读