boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - Most efficient Card implementation in java?
相关主题
Java 5.0 is out
Java5 compatibility issue
问个小问题
design问题
Java里有没有类似C++的IO重载<<>>?
增加点难度 java core
Singleton
access java parent class protected variable question
三论abstract class
看了zhaoce073大水忍不住说2句
相关话题的讨论汇总
话题: rank话题: suit话题: card话题: enum话题: public
进入Java版参与讨论
1 (共1页)
H****r
发帖数: 2801
1
是不是这样:
public class Card {
public enum Rank { DEUCE, ... , ACE }
public enum Suit { ... }
private final Rank rank;
private final Suit suit;
...
}
这样每个Card 的object只占用两个enum的内存?如果写成下面这样能更少不?
public class CardDetail {
public enum Rank { DEUCE, ... , ACE }
public enum Suit { ... }
private final Rank rank;
private final Suit suit;
...
}
public class Card {
private static final CardDetail[] = { ... }; // standard 52 cards
private final CardDetail card_;
...
}
Z*****Z
发帖数: 723
2
问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。
efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。

【在 H****r 的大作中提到】
: 是不是这样:
: public class Card {
: public enum Rank { DEUCE, ... , ACE }
: public enum Suit { ... }
: private final Rank rank;
: private final Suit suit;
: ...
: }
: 这样每个Card 的object只占用两个enum的内存?如果写成下面这样能更少不?
: public class CardDetail {

H****r
发帖数: 2801
3
俺java新人,轻拍...
这样?
public class Card {
private static final CardDetail[] cards = { ... }; // standard cards
private final byte cardId; //
...
Suit getSuit() { return cards[cardId].Suit(); }
...
}
这里如果cards直接初始化为标准52张牌,用cardId来实现getter/setter这样是不是最
compact?

【在 Z*****Z 的大作中提到】
: 问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。
: efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。

Z*****Z
发帖数: 723
4
我来逗逗闷子吧,别说Java了,拣一门你最熟练最顺手的语言,或者自然语言也行,写
这个最efficient的card应该怎么写?然后我们可以把它改成Java。。。

【在 H****r 的大作中提到】
: 俺java新人,轻拍...
: 这样?
: public class Card {
: private static final CardDetail[] cards = { ... }; // standard cards
: private final byte cardId; //
: ...
: Suit getSuit() { return cards[cardId].Suit(); }
: ...
: }
: 这里如果cards直接初始化为标准52张牌,用cardId来实现getter/setter这样是不是最

H****r
发帖数: 2801
5
好啊,先说下个人想法:
Card有rank和suit, 分别可以用enum Rank, enum Suit来表示。
标准的playing cards包括4种花色和13种rank的所有组合,再加上2张jokers,共54张
。这54张牌组成一个static const array常驻内存singleton.
每次实际用到Card的地方实际都是一个reference以到这个singleton里查询rank和suit
, 这样只需要一个handle即可。 54张牌的话这个handle可以用byte?
这里偶还不太了解java如何实现const array以及如何合理使用handle. 刚刚写了个用
array的似乎不被肯定啊...

【在 Z*****Z 的大作中提到】
: 我来逗逗闷子吧,别说Java了,拣一门你最熟练最顺手的语言,或者自然语言也行,写
: 这个最efficient的card应该怎么写?然后我们可以把它改成Java。。。

H****r
发帖数: 2801
6
public class Card
{
public static final int NUM_UNIQUE_CARDS = 54;
public enum Rank { ACE(1), DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6),
SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(11), QUEEN(12), KING(13),
JOKERONE(14), JOKERTWO(15); // including two jokers

private final int value; // face value
Rank(int faceValue) { value = faceValue; }
public int value() { return value; }
}
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES, JOKER } // including
joker
private final Rank rank;
private final Suit suit;
private Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank rank() { return rank; }
public Suit suit() { return suit; }
public String toString() { return rank + " of " + suit; }

// protoCards define different cards, use it when assembling decks
public static Card[] protoCards = new Card[NUM_UNIQUE_CARDS]; // hard
coded protoCards
static // Initialize protoCards
{
Rank[] ranks = { Rank.ACE, Rank.DEUCE, Rank.THREE, Rank.FOUR, Rank.
FIVE, Rank.SIX,
Rank.SEVEN, Rank.EIGHT, Rank.NINE, Rank.TEN, Rank.JACK, Rank.
QUEEN, Rank.KING };
Suit[] suits = { Suit.CLUBS, Suit.DIAMONDS, Suit.HEARTS, Suit.SPADES
};
int index = 0;
for(Suit suit : suits)
{
for(Rank rank : ranks)
{
protoCards[index++] = new Card(rank, suit);
}
}
protoCards[index++] = new Card(Rank.JOKERONE, Suit.JOKER);
protoCards[index] = new Card(Rank.JOKERTWO, Suit.JOKER);
}
public static final Card[] getUniqueCards()
{
return protoCards;
}
}

【在 Z*****Z 的大作中提到】
: 我来逗逗闷子吧,别说Java了,拣一门你最熟练最顺手的语言,或者自然语言也行,写
: 这个最efficient的card应该怎么写?然后我们可以把它改成Java。。。

Z*****Z
发帖数: 723
7
这个。。。你的问题是啥?
http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.h

),
),

【在 H****r 的大作中提到】
: public class Card
: {
: public static final int NUM_UNIQUE_CARDS = 54;
: public enum Rank { ACE(1), DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6),
: SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(11), QUEEN(12), KING(13),
: JOKERONE(14), JOKERTWO(15); // including two jokers
:
: private final int value; // face value
: Rank(int faceValue) { value = faceValue; }
: public int value() { return value; }

g*****g
发帖数: 34805
8
enum挺好,不大。52张牌,存储不需要什么优化。

【在 Z*****Z 的大作中提到】
: 问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。
: efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。

H****r
发帖数: 2801
9
嗯,这个不错,就是不太理解为啥还搞个map? 难道是因为array无法保证数据不会被修
改?

【在 Z*****Z 的大作中提到】
: 这个。。。你的问题是啥?
: http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.h
:
: ),
: ),

H****r
发帖数: 2801
10
谢好虫肯定!
如果用两个enum有浪费,或许可以只用一个enum CardId表示,rank和suit的结果都照
CardId做reference.

【在 g*****g 的大作中提到】
: enum挺好,不大。52张牌,存储不需要什么优化。
相关主题
design问题
Java里有没有类似C++的IO重载<<>>?
增加点难度 java core
Singleton
进入Java版参与讨论
Z*****Z
发帖数: 723
11
我刚才测试了一下,Hector的实现要是加上Serializable接口,序列化之后大小是72字
节。如果改用一个int或者byte实现的话,大小是30几字节。我猜想enum或许不大,但是
序列化的时候还要序列化enum的定义,可能20几字节吧?

【在 g*****g 的大作中提到】
: enum挺好,不大。52张牌,存储不需要什么优化。
g*****g
发帖数: 34805
12
你是不是面试题做太多了?真正实践里,最重要的是可维护。
接口清晰,结构简单,才是关键。52Million个数据,考虑一下
存储大小说得过去,52个,根本不用考虑。

但是

【在 Z*****Z 的大作中提到】
: 我刚才测试了一下,Hector的实现要是加上Serializable接口,序列化之后大小是72字
: 节。如果改用一个int或者byte实现的话,大小是30几字节。我猜想enum或许不大,但是
: 序列化的时候还要序列化enum的定义,可能20几字节吧?

Z*****Z
发帖数: 723
13
虫哥别生气。。。我没有一点儿说enum不好的。。。要是我写,我也会写enum。。。只
是逗逗闷子而已。。。

【在 g*****g 的大作中提到】
: 你是不是面试题做太多了?真正实践里,最重要的是可维护。
: 接口清晰,结构简单,才是关键。52Million个数据,考虑一下
: 存储大小说得过去,52个,根本不用考虑。
:
: 但是

S****h
发帖数: 558
14
In the practice, I would make my API as specific as possible. That is the
beauty of ENUM. It limit your choice and avoid the misuse. It is also self
-document.
z****e
发帖数: 54598
15
enum不需要序列化

【在 Z*****Z 的大作中提到】
: 问题:一个enum有多大?我前一阵子序列化过一个enum,好像挺大的。。。
: efficient的话,一个0到52之间的整数就能表示一张牌,一个byte。。。。

z****e
发帖数: 54598
16
这点小内存不用刻意去省,没有必要
我只在一种时候考虑过java的内存使用,当然内存泄露不算
就是在读取image的时候,因为image占的内存很大,而applet等一些小程序有内存限制
只有64m,所以我要考虑这个大小,其它的,只要是类的使用,不加载特别大东西的话
一般不需要考虑内存的使用
enum就是一个特殊的class
两个特征
1.内存中有限个
2.serializable
所以用enum可以很容易实现singleton

【在 H****r 的大作中提到】
: 谢好虫肯定!
: 如果用两个enum有浪费,或许可以只用一个enum CardId表示,rank和suit的结果都照
: CardId做reference.

H****r
发帖数: 2801
17
赞回复

【在 z****e 的大作中提到】
: 这点小内存不用刻意去省,没有必要
: 我只在一种时候考虑过java的内存使用,当然内存泄露不算
: 就是在读取image的时候,因为image占的内存很大,而applet等一些小程序有内存限制
: 只有64m,所以我要考虑这个大小,其它的,只要是类的使用,不加载特别大东西的话
: 一般不需要考虑内存的使用
: enum就是一个特殊的class
: 两个特征
: 1.内存中有限个
: 2.serializable
: 所以用enum可以很容易实现singleton

1 (共1页)
进入Java版参与讨论
相关主题
看了zhaoce073大水忍不住说2句
求助,using enum in eclipse
话说有一个模式叫做Multiton
关于singleton
关于 Java bean
问一个java design的题
topcoder上top ranked都是中国人阿
设计card deck问题,还有shuffle function,大家要搞清楚呀
求介绍设计parking lot的文档
问一道C++ class的问题
相关话题的讨论汇总
话题: rank话题: suit话题: card话题: enum话题: public