Существует ли такой объект, как «Набор», который может содержать только уникальные строковые значения, но также может содержать счетчик количества вхождений строкового значения? - PullRequest
1 голос
/ 05 декабря 2009

Есть ли в Java такой объект, как «Set», который может содержать только уникальные строковые значения, но также может содержать счетчик количества вхождений строкового значения?

Идея проста

С набором данных ala ...

A В В С С C

Я бы хотел добавить каждую строку текста в объект, похожий на Set. Каждый раз, когда неуникальный текст добавляется в набор, я бы также хотел, чтобы числовое значение было связано с набором, чтобы отобразить, сколько раз он был добавлен. Так что, если бы я запустил его на указанном выше наборе данных, результат будет примерно таким:

A: 1 БИ 2 С: 3

есть идеи?

Ответы [ 4 ]

16 голосов
/ 05 декабря 2009

Вам нужна сумка, например сумка в коллекциях Apache Commons или Multiset в коллекциях Google. Вы можете добавить одно и то же значение к нему несколько раз, и он будет записывать количество каждого значения. Затем вы можете опросить счет.

Вы бы сделали что-то подобное с Apache Commons ' Bag :

Bag myBag = new HashBag();
myBag.add("Orange");
myBag.add("Apple", 4);
myBag.add("Apple");
myBag.remove("Apple", 2);
int apples = myBag.getCount("Apple");  // Should be 3.
int kumquats = myBag.getCount("Kumquat"); // Should be 0.

И это с помощью Google Collections ' Multiset .

Multiset<String> myMultiset= HashMultiset.create();
myMultiset.add("Orange");
myMultiset.add("Apple", 4);
myMultiset.add("Apple");
myMultiset.remove("Apple", 2);
int apples = myMultiset.count("Apple");  // 3
int kumquats = myMultiset.count("Kumquats");  // 0

Проблема с Apache Collections в целом заключается в том, что он не очень активно поддерживается и еще не поддерживает Generics Java. Чтобы выйти из этого пробела, Google написал свои Коллекции , которые являются чрезвычайно мощными. Обязательно сначала оцените Коллекции Google.

Обновление: Google Collections также предлагает Multimap, «коллекцию, похожую на карту, но которая может связывать несколько значений с одним ключом».

10 голосов
/ 05 декабря 2009

Map<String, Integer> будет лучшим выбором, если выразить словами то, что вы хотите сделать, это Отобразить количество вхождений строки . В основном есть что-то вроде этого:

public void add(String s) {
    if (map.containsKey(s)) {
        map.put(s, map.get(s) + 1);
    } else {
        map.put(s, 1);
    }
}
2 голосов
/ 05 декабря 2009

Да, не прямо в ядре, но может быть легко построено с картой .

Вот наивная реализация:

import java.util.Map;
import java.util.HashMap;

public class SetLike {
    private Map<String, Integer> map = new HashMap<String,Integer>();

    public void add( String s ) {
        if( !map.containsKey( s ) ){
            map.put( s, 0 );
        }
        map.put( s, map.get( s ) + 1 );
    }

    public void printValuesAndCounts() {
        System.out.println( map );
    }

    public static void main( String [] args ){
        String [] data = {"A","B","B","C","C","C"};

        SetLike holder = new SetLike();

        for( String value : data ) {
            holder.add( value );
        }

        holder.printValuesAndCounts();
    }
}

Проверьте это

$ javac SetLike.java 
$ java SetLike
{A=1, C=3, B=2}

Конечно, вы можете улучшить это намного больше. Вы можете реализовать интерфейс Set, или List, или Collection и т. Д., Вы можете добавить итераторы, реализовать Iterable и т. Д., Это зависит от того, что вы хотите и что вам нужно.

0 голосов
/ 11 апреля 2014

Это будет полезно ..

    List<String> myList=new ArrayList<String>();
    myList.add("A");
    myList.add("B");
    myList.add("B");
    myList.add("C");
    myList.add("C");
    myList.add("C");        

    Set<String> set=new HashSet<String>(myList);

    for (String value : set)
    {
        int occurance=Collections.frequency(myList, value);
        System.out.println(value +" occur "+occurance + " times ");
    }

Результат:

      A occur 1 times 
      B occur 2 times 
      C occur 3 times 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...