Есть ли способ сделать счетчик слов вне области лямбды? - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно сделать счетчик слов для каждого «если условие» вне области действия лямбда-функции.Мне просто нужно рассчитать частоту появления конкретных слов.Как я могу это сделать?Нужно ли писать другую функцию вместо лямбда-функции?Как вы думаете, ребята?

private void readJSON(){
    String jsonFilePath = "animals.json";



    try(FileReader fileReader = new FileReader(jsonFilePath)){
        JsonObject json = (JsonObject) Jsoner.deserialize(fileReader);

        JsonArray animals = (JsonArray) json.get("animals");

        System.out.println("\nAnimals are :");
        animals.forEach(animal -> {
            JsonObject animalObject = (JsonObject) animal;

           int i=0;
           if (animalObject.get("typeof").equals("herbivore")){
               i++;
           }
           System.out.println("The amount of herbivores is: " + i);

            int j=0;
            if (animalObject.get("typeof").equals("herbivore") || animalObject.get("typeof").equals("carnivorous") && animalObject.get("growth").equals("small")){
                j++;
            }
            System.out.println("The amount of small herbivores or carnivorous is: " + j);

            int k=0;
            if (animalObject.get("typeof").equals("omnivorous") && !animalObject.get("growth").equals("high")){
                k++;
            }
            System.out.println("The amount of not high omnivorous is: " + k);

            System.out.println("Weight : " + animalObject.getString("weight")+", Growth : " + animalObject.get("growth")+", Type of : " + animalObject.get("typeof"));
        });

    } catch (Exception ex){
        ex.printStackTrace();
    }
}

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Вы можете создать класс, который содержит счетчики и карту, которая содержит значения и их счет. Вот код «на лету», настройте его при необходимости:

  class TypeCounter {
    private final AtomicInteger cnt = new AtomicInteger();
    private final String name;

    TypeCounter(String name) {
      this.name = name;
    }

    public void inc() {
      cnt.incrementAndGet();
    }

    @Override
    public String toString() {
      StringBuilder builder = new StringBuilder();
      builder.append("TypeCounter [result=");
      builder.append(cnt.get());
      builder.append(", ");
      if (name != null) {
        builder.append("name=");
        builder.append(name);
      }
      builder.append("]");
      return builder.toString();
    }
  }

public Console() {
    String names = "aa,aa,bb,aa,cc,ee,ee,ee";
    List<String> nameList = Arrays.asList(names.split(","));
    final Map<String, TypeCounter> test = new HashMap<>();
    nameList.forEach(item -> {
      TypeCounter cnt = test.get(item);
      if (Objects.isNull(cnt)) {
        TypeCounter tc = new TypeCounter(item);
        tc.inc();
        test.put(item, tc);
      } else {
        cnt.inc();
      }
    });

    System.out.println(test);
  }

  public static void main(String[] args) throws Exception {
    new Console();
  }
0 голосов
/ 03 апреля 2019

Просто объявите i, j и k за пределами forEach. Таким образом, они будут «разделены» через лямбда-вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...