- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一种方法,该方法将返回具有邻居的最大卡片集。例如,如果我有 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--;
}
}
}
最佳答案
我关注的是与“有邻居的最大牌组”相关的问题方面。如果对卡片排名值列表进行排序,这将转化为对列表运行进行分段然后从这些分段中选择最长运行的问题。
精明的读者会注意到与 this question 的相似之处.我将使用类似于 my answer 的技术对那个问题。
首先,让我们从包含 OP 示例中的输入列表开始。不过,以下技术应该适用于任何输入。
List<Rank> rankList = [FIVE, QUEEN, KING, ACE, TEN];
让我们排序并使这个列表具有独特的元素:
List<Rank> sorted = rankList.stream()
.distinct()
.sorted()
.collect(toList());
[FIVE, TEN, QUEEN, KING, ACE]
现在让我们计算应该将列表拆分为连续排名值的单独运行的位置。这发生在列表中彼此相邻的值不是连续排名值的位置。我们通过索引列表(从 1 开始)并通过检查列表中的相邻值来过滤索引来做到这一点:
List<Integer> splits = IntStream.range(1, sorted.size())
.filter(i -> sorted.get(i).ordinal() != sorted.get(i-1).ordinal() + 1)
.boxed()
.collect(toCollection(ArrayList::new));
[1, 2]
这些是运行之间的位置。这几乎足以创建子列表的信息,但它省略了第一个子列表的开头和最后一个子列表的结尾的索引。要添加这些,我们只需在前面添加 0 并在末尾添加 size:
splits.add(0, 0);
splits.add(list.size());
[0, 1, 2, 5]
现在我们可以使用每对索引来生成包含每次运行的子列表:
List<List<Rank>> runs = IntStream.range(1, splits.size())
.mapToObj(i -> list.subList(splits.get(i-1), splits.get(i)))
.collect(toList());
[[FIVE], [TEN], [QUEEN, KING, ACE]]
我们可以找到最长的运行,然后打印出与其长度匹配的运行:
int longest = runs.stream()
.mapToInt(list -> list.size())
.max()
.getAsInt();
runs.stream()
.filter(list -> list.size() == longest)
.forEach(System.out::println);
[QUEEN, KING, ACE]
综合起来,我们有:
static void split(List<Rank> rankList) {
List<Rank> sorted = rankList.stream()
.distinct()
.sorted()
.collect(toList());
List<Integer> splits = IntStream.range(1, sorted.size())
.filter(i -> sorted.get(i).ordinal() != sorted.get(i-1).ordinal() + 1)
.boxed()
.collect(toCollection(ArrayList::new));
splits.add(0, 0);
splits.add(sorted.size());
List<List<Rank>> runs = IntStream.range(1, splits.size())
.mapToObj(i -> sorted.subList(splits.get(i-1), splits.get(i)))
.collect(toList());
int longest = runs.stream()
.mapToInt(list -> list.size())
.max()
.getAsInt();
runs.stream()
.filter(list -> list.size() == longest)
.forEach(System.out::println);
}
关于java - 如果子集共享共同值(value),则将子集组合成更大的集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29826531/
我有一个 mysql 表,其中包含一些随机数字组合。为简单起见,以下表为例: index|n1|n2|n3 1 1 2 3 2 4 10 32 3 3 10 4 4
我有以下代码: SELECT sdd.sd_doc_classification, sdd.sd_title, sdd.sd_desc, sdr.sd_upl
如果我有两个要合并的数据框 Date RollingSTD 01/06/2012 0.16 01/07/2012 0.18 01/08/2012 0.17 01/09/20
我知道可以使用 lein ring war 创建一个 war 文件,但它似乎仍然包含码头依赖项。当我构建 war (并在 tomcat 上部署)时,有没有办法排除码头依赖项? 如果我根本不能做这件事,
维基百科关于封装的文章指出: “封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性” 我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 gette
对于我使用的组合框内的复选框: AOEDComboAssociationName = new Ext.form.ComboBox({ id: 'AOEDComboAssociationName',
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I combine LINQ expressions into one? public boo
如何在 rust 中找到排列或组合的数量? 例如C(10,6) = 210 我在标准库中找不到这个函数,也找不到那里的阶乘运算符(这就足够了)。 最佳答案 以@vallentin 的回答为基础,可以进
我有一个复杂的泛型类型用例,已在下面进行了简化 trait A class AB extends A{ val v = 10 } trait X[T<:A]{ def request: T }
如何使用 Hibernate 限制来实现此目的? (((A='X') and (B in('X',Y))) or ((A='Y') and (B='Z'))) 最佳答案 思考有效 Criteria c
我一定会在我的一个项目中使用谷歌图表。我需要的是,显示一个条形图,并且在条形图中,与每个条形相交的线代表另一个值。如果您查看下面的 jsfiddle,您会发现折线图仅与中间的条形图相交,并继续向其他条
只是一个简单的问题,我也很想得到答案,因为我不能百分百理解 Javascript 示例:假设您提示用户输入名称。够简单吧?但是你有一个数组,上面写着一些名字(其中之一就是),基本上就是我到目前为止所说
我试图通过 Haskell 理解函数式编程,但在处理函数组合时遇到了很多麻烦。 其实我有这两个功能: add:: Integer -> Integer -> Integer add x y = x
我正在寻找一种在 Realm 查询中组合 AND 和 OR 的方法。 这是我的课: class Event extends RealmObject { String id; String
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我是Combine 的新手,我想得到一个看似简单的东西。假设我有一个整数集合,例如: let myCollection = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想以例如 0
关于“优先组合而不是继承”的问题,我的老师是这样说的: 组合:现有类成为新类的组件 转发:新类中的每个实例方法,在现有类的包含实例上调用相应的方法并返回结果 包装器:新类封装了现有的 这三个概念我不是
我正在尝试将单个整数从 ASCII 值转换为 0 和 1。相关代码如下所示: int num1 = bin.charAt(0); int num2 = bin.charAt(1);
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 我经常看到“嵌套”类中的非静态变
我尝试合并两个数据集(DataFrame),如下所示: D1 = pd.DataFrame({'Village':['Ampil','Ampil','Ampil','Bachey','Bachey',
我是一名优秀的程序员,十分优秀!