0

我正在尝试使用 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();

  }
}

给我一些关于如何做到这一点的想法。谢谢。

注意:这不是家庭作业。我只是想给自己一些关于数组的练习。

4

6 回答 6

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上查看代码。

于 2012-10-09T09:09:03.157 回答
2

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

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()之后)。

于 2012-10-09T09:06:06.090 回答
2

您可以在

Map<String, Integer> myMap = new HashMap<String, Integer>();
于 2012-10-09T09:06:18.820 回答
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可以更有效,因为它可以减少创建的对象的数量

于 2012-10-09T09:16:34.943 回答
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
于 2012-10-09T09:14:29.097 回答
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 方法如何打印,insted,分别用 i 和 j 替换它们。

}

于 2012-10-09T09:17:14.863 回答