Организация, реализация и запросы классов структуры данных в Java - PullRequest
0 голосов
/ 30 сентября 2019

Я учу себя программировать на Java. Я новичок, но не совсем разбираюсь в программировании. Я решил сделать приложение, которое отслеживает билеты, клиенты и устройства для мастерской по ремонту компьютеров. Я сделал «много» кода для этого приложения, но, как я уже сказал, я новичок, могу ли я не знать, каков «правильный путь» (лучший, самый умный и удобный) для реализации структуры данных приложения.

Я решил использовать пользовательские классы данных, которые являются объектами значений в HashMap с целочисленными ключами и которые представляют таблицы данных, которые отражают таблицы данных в базах данных. Я делаю это неправильно?

public class Clients
{
    private String firstName;
    private String lastName;
    private String primePhoneNum;
    private String secondPhoneNum;
    private String email;
    private String address;
    private MarketingTypes marketing;

   //getters and setters
}

public HashMap<Integer,Clients> clientsTable = new HashMap<Integer, Clients>();

Я столкнулся с проблемой, когда попытался создать функцию поиска, которая возвращает объект значения в HashMap на основе значения этого поля конкретного объекта. Например:

public class SearchDeviceTypes
{   
    private Map<Integer, DeviceTypes> deviceTypesTable;

    public SearchDeviceTypes(Map<Integer, DeviceTypes> deviceTypesTable)
    {
        this.deviceTypesTable = deviceTypesTable;
    }

    public boolean isNameTaken(String name)
    {
        return deviceTypesTable.entrySet().stream()
                .anyMatch(deviceType->deviceType.getValue().getName().equals(name));
    }

    public DeviceTypes getByID(int id)
    {
        return deviceTypesTable.get(id);
    }

    public Map<Integer, DeviceTypes> filterByName(String text)
    {
        return  deviceTypesTable.entrySet().stream()
                .filter(deviceType->deviceType.getValue().getName().contains(text))
                .collect(Collectors.toMap(deviceType -> deviceType.getKey(), deviceType -> deviceType.getValue())); 
    }

    public DeviceTypes getByName(String name)
    {
        //How to implement this?
        return null;
    }
}

Я хотел бы помочь мне узнать, как реализовать такую ​​структуру данных. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы должны смягчить свою логику:

public Map<Integer, DeviceTypes> filterByName(String text)
    {
        return  deviceTypesTable.entrySet().stream()
                .filter(deviceType->deviceType.getValue().getName().contains(text))
                .collect(Collectors.toMap(deviceType -> deviceType.getKey(), deviceType -> deviceType.getValue())); 
    }

Вам просто нужно передать Predicate<DeviceType> вместо жесткого кодирования логики, используя .getName().contains(text):

public Map<Integer, DeviceType> filterBy(Predicate<DeviceType> predicate) { 
  Objects.requireNonNull(predicate, "predicate");
  return deviceTypesTable.entrySet().stream()
           .filter(entry ->  predicate.test(entry.getValue())
           .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 
}

Вы можете использовать псевдонимоднако это:

public Map<Integer, DeviceType> filterByName(String name) {
  Objects.requireNonNull(name, "name");
  return filterBy(dt -> dt.getName().contains(name));
}

Так как вы хотите DeviceType, это даст:

public Optional<DeviceType> findFirst(Predicate<DeviceType> predicate) { 
  Objects.requireNonNull(predicate, "predicate");
  return deviceTypesTable.values().stream()
           .filter(predicate)
           .findFirst();
}

Метод вернет первый DeviceType, соответствующий предикату, например:

allDevices.findFirst(dt -> "disk".equalsIgnoreCase(dt.name)).ifPresent(dt -> {
  System.out.println("deviceType: " + dt);
});
0 голосов
/ 01 октября 2019

Если я вас хорошо понял, вам нужно просто указать параметр ID в вашем классе Clients. Вам не нужно создавать структуру только для идентификатора.

...