我正在尝试使用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();
}
}
给我一些关于如何实现这一目标的想法。感谢。
注意:这不是作业。我只是想给自己一些关于阵列的练习。
答案 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替换它们。
}