Счетчик инкремента - PullRequest
       0

Счетчик инкремента

0 голосов
/ 29 февраля 2020

, поэтому я просто учусь кодировать в JS, поэтому я просто хочу предупредить вас, что мой код может выглядеть очень ужасно для вас.

Я хочу "класс", который подсчитывает, как часто число было подсчитано.

Пример:

counter = new Counter();
counter.count(1);
counter.count(1);
counter.count(3);

Вызов getCounts дает результат:

counter.getCounts();
> 1: 2, 3: 1

Мой код работает, но у меня две проблемы.

  1. Поскольку я храню его в массиве, я могу выводить числа не по порядку, а в порядке их вызова.
  2. Не думаю, что это симпатичное решение.

Мой код:

class Counter {
    constructor(arr = []) {
        this.arr = arr;
    }

    count(number) {
        var posNumber = [];
        var evenNumCheck = false;
        var exactPos;
        //Check if have the number already in the array
        for (var i = 0; i < this.arr.length; i++) {
            if (this.arr[i] === number) {
                posNumber.push(i);
            }
        }
        //posNumber we have the position of all the numbers that match our argument number
        // we check which of them has an even position, only this can be the number we want
        // since we save [number,count; number,count]
        for (var i = 0; i < posNumber.length; i++) {
            if (i % 2 === 0) {
                evenNumCheck = true;
                exactPos = i;
            }
        }
        if (evenNumCheck) {
            this.arr[exactPos + 1]++;
        } else {
            this.arr.push(number);
            this.arr.push(1);
        }
    }

    getCounts() {
        var string = '';
        for (var i = 0; i < this.arr.length; i += 2) {
            if (i + 2 >= this.arr.length) {
                string += this.arr[i] + ': ' + this.arr[i + 1];
            } else {
                string += this.arr[i] + ': ' + this.arr[i + 1] + ', ';
            }
        }
        console.log(string);
    }
}

Считаете ли вы, что это решение в порядке или есть лучшие решения для него, которые также могут выводить числа по порядку?

1 Ответ

1 голос
/ 01 марта 2020

Классификация c - это использование объекта, как сказал @Orkhan Alikhanov

class Counter {
  constructor () {
    this.dic = {}
  }
  count (number) {
    if (number in this.dic) {
      this.dic[number]++
    } else {
      this.dic[number] = 1
    }
  }

  getCounts () {
    // instead of doing the trailing comma stuff
    // make an array of string and join the array
    const out = Object.entries(this.dic).map(entry => entry.join(':')).join(',')
    console.log(out)
  }
}
const counter = new Counter()
counter.count(1)
counter.count(1)
counter.count(2)
counter.getCounts()

Вы можете предпочесть использовать карту, поскольку семантически вы просто хотите сопоставить число с количеством.

class Counter {
  constructor () {
    this.dic = new Map()
  }
  count (number) {
    const count = this.dic.get(number)
    this.dic.set(number, count ? count + 1 : 1)
  }

  getCounts () {
    const out = [...this.dic.entries()].map(entry => entry.join(':')).join(',')
    console.log(out)
  }
}
const counter = new Counter()
counter.count(1)
counter.count(1)
counter.count(2)
counter.getCounts()

Наконец, если вы хотите, чтобы число печаталось не в том порядке, в котором они были вставлены, а в порядке «int», вы должны отсортировать записи :

class Counter {
  constructor () {
    this.dic = new Map()
  }
  count (number) {
    const count = this.dic.get(number)
    this.dic.set(number, count ? count + 1: 1)
  }

  getCounts () {
    const out = [...this.dic.entries()]
      .sort((a, b) => a[0] - b[0]) // sort by first key (which is the number)
      .map(entry => entry.join(':'))
      .join(',')
    console.log(out)
  }
}
const counter = new Counter()
counter.count(2) // insert 2 before
counter.count(1)
counter.count(1)
counter.getCounts()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...