Redian新闻
>
Most efficient Card implementation in java?
avatar
Most efficient Card implementation in java?# Java - 爪哇娇娃
n*i
1
能力有限,欢迎大家拍砖。
avatar
H*r
2
是不是这样:
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_;
...
}
avatar
s*y
3
这个不是上次发过的?你这个照片应该好好照一下,呵呵,画得挺不错的

【在 n*****i 的大作中提到】
: 能力有限,欢迎大家拍砖。
avatar
Z*Z
4
问题:一个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 {

avatar
L*v
5
建议如果是临摹的,最好连原画一起贴上来,这样大家至少有个比较。
个人不是很喜欢这样的色彩
除了原画色调,照相问题等等因素,有一个问题至少是应该注意的,就是冷色调太突兀
面积也太大,没能与暖色调足够融合,这造成特别是在脸上“花、脏”的感觉。

【在 n*****i 的大作中提到】
: 能力有限,欢迎大家拍砖。
avatar
H*r
6
俺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。。。。

avatar
n*i
7


【在 n*****i 的大作中提到】
: 能力有限,欢迎大家拍砖。
avatar
Z*Z
8
我来逗逗闷子吧,别说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这样是不是最

avatar
U*w
9
这画多大的尺寸啊?

【在 n*****i 的大作中提到】

avatar
H*r
10
好啊,先说下个人想法:
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。。。

avatar
H*r
11
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。。。

avatar
Z*Z
12
这个。。。你的问题是啥?
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; }

avatar
g*g
13
enum挺好,不大。52张牌,存储不需要什么优化。

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

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

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

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

但是

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

avatar
Z*Z
18
虫哥别生气。。。我没有一点儿说enum不好的。。。要是我写,我也会写enum。。。只
是逗逗闷子而已。。。

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

avatar
S*h
19
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.
avatar
z*e
20
enum不需要序列化

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

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

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

avatar
H*r
22
赞回复

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

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。