计算字符串数组中出现的次数

时间:2012-10-09 09:03:35

标签: java arrays

我正在尝试使用Java数组。我想要做的是计算数组字符串元素的出现次数。例如:

Clubs - 8 
Clubs - Ace 
Clubs - Jack
Hearts - 9 
Spades - 3
Hearts - 6

发生次数:

Clubs - 3
Hearts - 2
Spades - 1
Diamonds - 0

到目前为止,我只对此进行了编码:

public class CardGame {
public static void main(String[] args){

     String[] suit = { "Clubs", "Hearts", "Diamonds", "Spades" };
     String[] deck = { "2", "3", "4", "5", "6", "7", "8", "9", "10",
                        "Jack", "Queen", "King", "Aces" };

     for( int a = 0; a < 7; a++ ){
     int i = (int) ( Math.random() * suit.length );
     int j = (int) ( Math.random() * deck.length );
         //System.out.println( "Suit " + suit[i] + " Deck " + deck[j] );
     System.out.println( suit[(int) (Math.random() * suit.length)]
             + " : " + deck[(int) (Math.random() * deck.length)]);
     }
            System.out.println();

  }
}

给我一​​些关于如何实现这一目标的想法。感谢。

注意:这不是作业。我只是想给自己一些关于阵列的练习。

6 个答案:

答案 0 :(得分:3)

我相信你错过了上一个问题的答案。我们的想法是在循环中使用i和j的值,而不是生成它们两次。这是一个有效的例子。我没有使用哈希地图,因为你之前知道套装及其数量,所以只需一个数组即可:

public class Main {
    public static void main(String[] args){

         String[] suit = { "Clubs", "Hearts", "Diamonds", "Spades" };
         String[] deck = { "2", "3", "4", "5", "6", "7", "8", "9", "10",
                            "Jack", "Queen", "King", "Aces" };
         int counts[] = new int[4];
         for( int a = 0; a < 7; a++ ){
         int i = (int) ( Math.random() * suit.length );
         int j = (int) ( Math.random() * deck.length );
             //System.out.println( "Suit " + suit[i] + " Deck " + deck[j] );
         System.out.println( suit[i] + " : " + deck[j]);
         counts[i]++;
         }
                System.out.println();
         for (int i =0;i<4;++i){
            System.out.println(suit[i] + " : " + counts[i]);
         }

      }
    }

您可以在ideone上看到代码。

答案 1 :(得分:2)

您可以使用HashMap来保存出现次数。

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

for(String value : array)
{
    Integer oldValue = occurences.get(value);
    if(oldValue == null)
        occurences.put(value, 1);
    else
        occurences.put(value, oldValue + 1);
}

但是,您可能希望先删除最后的数字(提示:之后使用String#split("-")String#trim())。

答案 2 :(得分:2)

您可以在

中维护计数器
Map<String, Integer> myMap = new HashMap<String, Integer>();

答案 3 :(得分:1)

您对使用Map<String, Integer>

的两种变体感兴趣
final Map<String, AtomicInteger> countMap = new LinkedHashMap<>();

public void count(String text) {
    AtomicInteger ai = countMap.get(text);
    if (ai == null) countMap.put(text, ai = new AtomicInteger());
    ai.getAndIncrement();
}

TObjectIntHashMap<String> countMap = new TObjectIntHashMap<>();

public void count(String text) {
    countMap.adjustOrPutValue(text, 1, 1);
}

TObjectIntHashMap可以提高效率,因为它可以减少创建的对象数量。

答案 4 :(得分:0)

以下是我的问题实施(使用JRE 6运行):

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("Clubs - 8");
        list.add("Clubs - Ace");
        list.add("Clubs - Jack");
        list.add("Hearts - 9");
        list.add("Spades - 3");
        list.add("Hearts - 6");

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

        for (String card : list) {
            String suit = card.split("-")[0].trim();
            String deck = card.split("-")[0].trim();
            if (countMap.containsKey(suit)) {
                countMap.put(suit, countMap.get(suit) + 1);
            } else {
                countMap.put(suit, 0);
            }
        }

        System.out.println("Count of cards:");
        for (String card : countMap.keySet()) {
            System.out.println(card + ":" + countMap.get(card));
        }

    }

}

输出:

Count of cards:
Spades:0
Hearts:1
Clubs:2

答案 5 :(得分:0)

这样做:

int[] suitCount=new int[4];
for( int a = 0; a < 7; a++ ){
 int i = (int) ( Math.random() * suit.length );
 int j = (int) ( Math.random() * deck.length );
     //System.out.println( "Suit " + suit[i] + " Deck " + deck[j] );
 System.out.println( suit[(int) (Math.random() * suit.length)]
         + " : " + deck[(int) (Math.random() * deck.length)]);
suitCount[i]++;
 }
for(int i=0;i<4;i++)
System.out.println(suit[i]+" - "+suitCount[i]);

尽管如此,当你重新分配套装和套牌的指数时,我不确定你打算如何打印println方法,然后分别用i和j替换它们。

}