【发布时间】:2015-07-01 19:41:56
【问题描述】:
我正在尝试创建一种方法,该方法将返回具有邻居的最大卡片集。例如,如果我有list<RANK> rankList = [FIVE, QUEEN, KING, ACE, TEN],它将返回[KING, ACE, QUEEN]。我还没有完全实现它,但我得到了那个部分,将一个集合拆分为多个较小的集合。
private boolean isStraight(List<Card> cards) {
Set<RANK> rankList = cards.stream()
.map(Card::getRank)
.distinct()
.collect(Collectors.toSet());
List<Set<RANK>> subSets = new ArrayList<>();
for(RANK rank : rankList) {
int currRankValue = rank.getValue();
RANK prevRank = RANK.getRank(currRankValue - 1);
RANK nextRank = RANK.getRank(currRankValue + 1);
if(!subSets.stream().anyMatch(set -> set.contains(rank))) {
Set<RANK> newSet = new HashSet<>();
newSet.add(rank);
subSets.add(newSet);
}
subSets.stream()
.filter(set -> (set.contains(prevRank) || set.contains(nextRank)))
.forEach( set -> set.add(rank));
}
System.out.print(subSets);
return false;
}
Card.java:
public static enum RANK {
NONE(0),
TWO(2), THREE(3), FOUR(4), FIVE(5),
SIX(6), SEVEN(7), EIGHT(8), NINE(9),
TEN(10), JACK(11), QUEEN(12), KING(13), ACE(14);
private final int value;
private RANK(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static RANK getRank(int value) {
for(RANK r : RANK.values() ) {
if (r.getValue() == value)
return r;
}
return NONE;
}
}
在我检查是否有 5 张或更多牌可以形成顺子之前,我已经组合了至少具有一个共同价值的子系列。我该怎么做?我想不出任何不涉及很多循环的东西。
已编辑
添加了整个Card.java:
ppackage deck;
public class Card implements Comparable {
public static enum SUIT {
SPADES,
HEARTS,
CLUBS,
DIAMONDS
}
public static enum RANK {
NONE(0),
TWO(2), THREE(3), FOUR(4), FIVE(5),
SIX(6), SEVEN(7), EIGHT(8), NINE(9),
TEN(10), JACK(11), QUEEN(12), KING(13), ACE(14);
private final int value;
private RANK(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static RANK getRank(int value) {
for(RANK r : RANK.values() ) {
if (r.getValue() == value)
return r;
}
return NONE;
}
}
private final RANK rank;
private final SUIT suit;
public Card(RANK rank, SUIT suit) {
this.rank = rank;
this.suit = suit;
}
public RANK getRank() {
return rank;
}
public SUIT getSuit() {
return suit;
}
@Override
public String toString() {
return "Card{" +
"rank=" + rank +
", suit=" + suit +
'}';
}
@Override
public int compareTo(Object that) {
return this.rank.getValue() - ((Card) that).rank.getValue();
}
}
已编辑
添加了带循环的解决方案: 在方法中返回之前添加它。
for(int index = 0; index < subSets.size(); index++) {
for(int index2 = 1; index2 < subSets.size(); index2++) {
if(!Collections.disjoint(subSets.get(index), subSets.get(index2)) && index != index2) {
subSets.get(index).addAll(subSets.remove(index2));
index2--;
}
}
}
【问题讨论】:
-
我看到你拼写了两次。 (与您的问题无关)。可以出示一下卡类吗?
-
那么两张牌什么时候相等?
-
我想我可以使用与
.reduce()方法类似的方法,它会对之后的每个人进行计算 1,而不是对下一个进行 1。 -
JVM 是怎么知道的?
标签: java set java-8 java-stream