Как считать количество случаев элемента в Списке

Вам необходимо объявить pointsNumber вне функции:

var pointsNumber = 0;
document.getElementById("guess-number").onclick = function() {

        var ourNumber;
        var randomNumber;

В противном случае, каждый раз, когда вызывается функция onclick, вы объявляете pointsNumber и устанавливаете ее в 0. Затем она получает +1 или -1 в зависимости от if / else, что объясняет поведение, которое вы наблюдаете.

158
задан Stefan van den Akker 1 May 2015 в 11:27
поделиться

10 ответов

Если Вы - пользователь моего ForEach DSL, он может быть сделан с Count запрос.

Count<String> query = Count.from(list);
for (Count<Foo> each: query) each.yield = "bat".equals(each.element);
int number = query.result();
0
ответ дан akuhn 23 November 2019 в 21:38
поделиться

Также - это старомодный путь и самокрутка:

Map<String, Integer> instances = new HashMap<String, Integer>();

void add(String name) {
     Integer value = instances.get(name);
     if (value == null) {
        value = new Integer(0);
        instances.put(name, value);
     }
     instances.put(name, value++);
}
0
ответ дан Mark Renouf 23 November 2019 в 21:38
поделиться

Поместите элементы arraylist в hashMap для подсчета частоты.

1
ответ дан Shamik 23 November 2019 в 21:38
поделиться

Немного более эффективный подход мог бы быть

Map<String, AtomicInteger> instances = new HashMap<String, AtomicInteger>();

void add(String name) {
     AtomicInteger value = instances.get(name);
     if (value == null) 
        instances.put(name, new AtomicInteger(1));
     else
        value.incrementAndGet();
}
6
ответ дан Peter Lawrey 23 November 2019 в 21:38
поделиться

Интересно, почему Вы не можете использовать Набор того Google API с JDK 1.6. Это говорит так? Я думаю, что Вы можете, не должно быть никаких проблем совместимости, поскольку это создается для более низкой версии. Случай отличался бы, если это было создано для 1,6, и Вы работаете 1.5.

я неправильно где-нибудь?

8
ответ дан Adeel Ansari 23 November 2019 в 21:38
поделиться

Нет никакого собственного метода в Java, чтобы сделать это для Вас. Однако можно использовать IterableUtils#countMatches () от Наборов палаты общин Apache, чтобы сделать это для Вас.

10
ответ дан Kyle 23 November 2019 в 21:38
поделиться

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

HashMap<String,int> frequencymap = new HashMap<String,int>();
foreach(String a in animals) {
  if(frequencymap.containsKey(a)) {
    frequencymap.put(a, frequencymap.get(a)+1);
  }
  else{ frequencymap.put(a, 1); }
}
11
ответ дан Ray Hidayat 23 November 2019 в 21:38
поделиться

Это показывает, почему это важно для" , Относятся к объектам их интерфейсами ", как описано в Эффективная книга Java.

, Если Вы кодируете к реализации и используете ArrayList в скажем, 50 мест в Вашем коде при нахождении хорошей реализации "Списка", которые считают объекты, необходимо будет изменить все те 50 мест, и вероятно необходимо будет взломать код (если это только используется Вами нет грандиозного предприятия, но если это будет использоваться кем-то еще использование, то Вы взломаете их код также)

Путем программирования к интерфейсу, можно позволить тем 50 неизменным местам и заменить реализацию от ArrayList до "CountItemsList" (например), или некоторого другого класса.

Ниже очень простой образец о том, как это могло быть записано. Это - только образец, производство, готовый Список был бы очень более сложен.

import java.util.*;

public class CountItemsList<E> extends ArrayList<E> { 

    // This is private. It is not visible from outside.
    private Map<E,Integer> count = new HashMap<E,Integer>();

    // There are several entry points to this class
    // this is just to show one of them.
    public boolean add( E element  ) { 
        if( !count.containsKey( element ) ){
            count.put( element, 1 );
        } else { 
            count.put( element, count.get( element ) + 1 );
        }
        return super.add( element );
    }

    // This method belongs to CountItemList interface ( or class ) 
    // to used you have to cast.
    public int getCount( E element ) { 
        if( ! count.containsKey( element ) ) {
            return 0;
        }
        return count.get( element );
    }

    public static void main( String [] args ) { 
        List<String> animals = new CountItemsList<String>();
        animals.add("bat");
        animals.add("owl");
        animals.add("bat");
        animals.add("bat");

        System.out.println( (( CountItemsList<String> )animals).getCount( "bat" ));
    }
}

принципы OO, примененные здесь: наследование, полиморфизм, абстракция, инкапсуляция.

22
ответ дан OscarRyz 23 November 2019 в 21:38
поделиться

То, что Вы хотите, является Сумкой - который похож на набор, но также и считает количество происшествий. К сожалению, платформа Наборов Java - большой, как они, не имеет Сумки impl. Поскольку тот должен использовать Apache Общий Набор текст ссылки

5
ответ дан mP. 23 November 2019 в 21:38
поделиться

Я почти уверен, что статический частотный метод в Коллекциях пригодится здесь:

int occurrences = Collections.frequency(animals, "bat");

Я бы так и поступил в любом случае. Я почти уверен, что это jdk 1.6.

310
ответ дан 23 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: