Java实战报错

哪错了

Preview

在这段Java代码中,map.put("Cc", 20); 这一行的键 "Cc" 被标记为错误。这可能是由于以下几种原因:

  1. 键值类型不匹配:虽然在你的代码中没有显示出来,但确保 HashMap 的键是 String 类型,而你传入的是一个字符串 "Cc"

  2. 大小写敏感性:Java中的字符串是大小写敏感的。如果你之前已经插入了一个键 "cc"(小写),那么再尝试插入 "Cc"(首字母大写)会被视为不同的键。

  3. 拼写错误:确保你在其他地方使用这个键时拼写完全一致。

  4. 编译器或IDE提示:有时候,IDE(如IntelliJ IDEA或Eclipse)可能会根据上下文给出一些提示或警告,这些提示可能与实际的编译错误无关。

  5. 语法错误:检查是否有遗漏的分号、括号等语法错误。

  6. 类名问题:确保类名 test 符合你的项目结构和命名规范。

  7. 包导入问题:确保你正确导入了 java.util.HashMap

如果以上都没有问题,建议你检查一下具体的错误信息,通常编译器会给出更详细的错误提示。

Java详细描述foreach

在 Java 中,foreach 是一种增强的 for 循环(Enhanced For Loop),用于简化对数组或集合(如 ListSet 等)的遍历操作。它提供了一种更简洁、易读的方式来访问集合或数组中的每个元素,而无需显式地使用索引或迭代器。

以下是详细的描述和用法:


1. 语法

 

java

深色版本

for (ElementType element : collectionOrArray) {// 对每个元素的操作
}
  • ElementType:表示集合或数组中元素的类型。
  • element:循环变量,每次循环时会被赋值为集合或数组中的当前元素。
  • collectionOrArray:要遍历的集合(如 ListSet)或数组。

2. 与传统 for 循环的区别

传统的 for 循环需要手动管理索引或迭代器,而 foreach 则隐藏了这些细节。

传统 for 循环示例:
 

java

深色版本

int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]);
}
使用 foreach 的示例:
 

java

深色版本

int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {System.out.println(number);
}

可以看到,foreach 不需要显式地使用索引变量 i,代码更加简洁。


3. 适用场景

  • 数组:可以直接用于遍历一维或多维数组。
  • 集合:可以用于遍历实现了 Iterable 接口的集合类,例如 ArrayListHashSet 等。

4. 示例代码

遍历数组:
 

java

深色版本

String[] names = {"Alice", "Bob", "Charlie"};
for (String name : names) {System.out.println(name);
}
// 输出:
// Alice
// Bob
// Charlie
遍历集合:
 

java

深色版本

List<Integer> numbers = Arrays.asList(10, 20, 30, 40);
for (int number : numbers) {System.out.println(number);
}
// 输出:
// 10
// 20
// 30
// 40
遍历多维数组:
 

java

深色版本

int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};for (int[] row : matrix) {for (int value : row) {System.out.print(value + " ");}System.out.println();
}
// 输出:
// 1 2 3 
// 4 5 6 
// 7 8 9 

5. 优点

  • 简洁性:减少了索引变量或迭代器的显式声明,使代码更加清晰。
  • 可读性:专注于元素本身,而不是遍历逻辑。
  • 安全性:避免了因索引越界或错误操作迭代器而导致的运行时错误。

6. 限制

尽管 foreach 提供了许多便利,但它也有一些限制:

  1. 无法修改原数组或集合的内容

    • 在 foreach 中,循环变量是集合或数组中元素的一个副本,因此直接修改它不会影响原数组或集合。
     java 

    深色版本

    int[] numbers = {1, 2, 3};
    for (int number : numbers) {number = 10; // 这不会改变原数组
    }
    System.out.println(Arrays.toString(numbers)); // 输出 [1, 2, 3]
  2. 无法获取索引

    • 如果需要知道当前元素的索引位置,则需要使用传统的 for 循环。
     java 

    深色版本

    String[] names = {"Alice", "Bob", "Charlie"};
    for (int i = 0; i < names.length; i++) {System.out.println("Index: " + i + ", Name: " + names[i]);
    }
  3. 只适用于遍历

    • foreach 只能用于遍历集合或数组,不能用于其他操作(如添加、删除元素)。

7. 总结

foreach 是 Java 中一种非常方便的遍历工具,尤其适合在不需要索引或修改集合内容的情况下使用。它的语法简单、直观,能够显著提高代码的可读性和开发效率。但在需要索引或修改集合的情况下,仍然需要使用传统的 for 循环或迭代器。

如果你有更多关于 foreach 的具体问题,欢迎继续提问!

代码模式

帮我写

Preview

根据图片中的描述,以下是业务需求和分析实现的详细说明:

分析业务需求

  1. 总共有54张牌

    • 包括52张普通扑克牌和2张大小王。
  2. 点数

    • 普通扑克牌的点数包括:"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"。
    • 特殊点数:大小王(大王和小王)。
  3. 花色

    • 普通扑克牌的花色包括:"♠" (黑桃), "♥" (红心), "♦" (方块), "♣" (梅花)。
  4. 大小王

    • 大王:红色
    • 小王:黑色
  5. 斗地主

    • 发出51张牌,剩下3张作为底牌。

分析实现

1. 准备好54张牌

在启动游戏房间时,应该提前准备好54张牌。这包括52张普通扑克牌和2张大小王。

 

java

深色版本

import java.util.ArrayList;
import java.util.List;public class PokerGame {public static List<String> preparePokerCards() {List<String> cards = new ArrayList<>();// 添加普通扑克牌String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};String[] suits = {"♠", "♥", "♦", "♣"};for (String rank : ranks) {for (String suit : suits) {cards.add(rank + suit);}}// 添加大小王cards.add("大王");cards.add("小王");return cards;}public static void main(String[] args) {List<String> pokerCards = preparePokerCards();System.out.println("Total number of cards: " + pokerCards.size());System.out.println("All cards: " + pokerCards);}
}
2. 洗牌、发牌、对牌排序、看牌

接下来,需要完成洗牌、发牌、对牌排序和看牌的功能。

 

java

深色版本

import java.util.Collections;
import java.util.List;public class PokerGame {public static List<String> preparePokerCards() {List<String> cards = new ArrayList<>();// 添加普通扑克牌String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};String[] suits = {"♠", "♥", "♦", "♣"};for (String rank : ranks) {for (String suit : suits) {cards.add(rank + suit);}}// 添加大小王cards.add("大王");cards.add("小王");return cards;}public static void shuffleAndDeal(List<String> cards, int numPlayers, int cardsPerPlayer) {// 洗牌Collections.shuffle(cards);// 发牌List<List<String>> playerHands = new ArrayList<>();for (int i = 0; i < numPlayers; i++) {List<String> hand = new ArrayList<>(cards.subList(i * cardsPerPlayer, (i + 1) * cardsPerPlayer));playerHands.add(hand);}// 底牌List<String> bottomCards = new ArrayList<>(cards.subList(numPlayers * cardsPerPlayer, cards.size()));System.out.println("Player hands:");for (int i = 0; i < playerHands.size(); i++) {System.out.println("Player " + (i + 1) + ": " + playerHands.get(i));}System.out.println("Bottom cards: " + bottomCards);}public static void main(String[] args) {List<String> pokerCards = preparePokerCards();shuffleAndDeal(pokerCards, 3, 17); // 3个玩家,每人17张牌}
}

解释

  1. 准备扑克牌

    • 使用 preparePokerCards 方法生成54张牌,并返回一个包含所有牌的列表。
  2. 洗牌和发牌

    • 使用 shuffleAndDeal 方法进行洗牌和发牌。
    • Collections.shuffle(cards) 用于洗牌。
    • 根据玩家数量和每人的牌数进行分发。
    • 最后输出每个玩家的手牌和底牌。

这样,就可以实现斗地主游戏中从准备牌到发牌的基本功能。

为什么

Preview

在这段代码中,错误提示指出 List<Card> cards = {}; 是不允许的。具体原因如下:

  1. 语法错误

    • 在 Java 中,List 是一个接口,不能直接实例化。你需要使用具体的实现类,如 ArrayList 或 LinkedList
    • 直接使用 {} 语法来初始化列表是不正确的,这通常用于数组或集合的字面量表示。
  2. 正确的方式

    • 使用具体的实现类来初始化 List
    • 如果你想创建一个空的 List,可以使用 new ArrayList<>()

示例代码

以下是正确的初始化方式:

 

java

深色版本

import java.util.List;
import java.util.ArrayList;public class RoomStart {List<Card> cards = new ArrayList<>(); // 正确的初始化方式public void prepareCard() {// 方法体}
}

解释

  • List<Card> cards = new ArrayList<>();:这是使用泛型安全的方式来初始化一个空的 ArrayList
  • ArrayListArrayList 是 List 接口的一个具体实现类,它提供了动态数组的功能。

其他选项

如果你想要一个固定大小的列表,可以使用 Collections.emptyList()

 

java

深色版本

import java.util.List;
import java.util.Collections;public class RoomStart {List<Card> cards = Collections.emptyList(); // 创建一个不可变的空列表public void prepareCard() {// 方法体}
}

总结

在 Java 中,直接使用 {} 来初始化 List 是不被允许的。你需要使用具体的实现类(如 ArrayList)来初始化 List。这样可以确保代码的正确性和安全性。

用stream流洗牌

在 Java 中,Stream 是一种强大的工具,用于处理集合或数组中的数据。尽管 Stream 本身并没有直接提供“洗牌”功能,但我们可以结合 Collections.shuffle() 或其他随机化方法来实现类似的效果。

以下是使用 StreamCollections.shuffle() 实现洗牌的代码示例:


示例代码

 

java

深色版本

import java.util.*;
import java.util.stream.Collectors;public class ShuffleWithStream {public static void main(String[] args) {// 创建一副扑克牌List<String> cards = createDeck();System.out.println("原始牌组:");System.out.println(cards);// 使用 Stream 和 Collections.shuffle() 洗牌List<String> shuffledCards = shuffleDeck(cards);System.out.println("\n洗牌后的牌组:");System.out.println(shuffledCards);}// 创建一副扑克牌private static List<String> createDeck() {String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] suits = {"♠", "♥", "♦", "♣"};List<String> deck = new ArrayList<>();for (String suit : suits) {for (String rank : ranks) {deck.add(rank + suit);}}deck.add("小王");deck.add("大王");return deck;}// 使用 Stream 和 Collections.shuffle() 洗牌private static List<String> shuffleDeck(List<String> deck) {// 将牌组转换为流并收集到一个新的列表中List<String> shuffled = deck.stream().collect(Collectors.collectingAndThen(Collectors.toList(),list -> {Collections.shuffle(list); // 洗牌return list;}));return shuffled;}
}

代码解析

  1. 创建扑克牌

    • createDeck() 方法生成一副完整的扑克牌(包括大小王)。
    • 每张普通扑克牌由点数和花色组成,例如 "3♠""K♥" 等。
  2. 洗牌逻辑

    • shuffleDeck() 方法使用 Stream 将牌组转换为流,并通过 Collectors.collectingAndThen 在最终收集时调用 Collections.shuffle() 进行洗牌。
    • Collections.shuffle() 是一个经典的随机化方法,它会打乱列表中的元素顺序。
  3. 输出结果

    • 打印原始牌组和洗牌后的牌组,验证洗牌效果。

输出示例

运行上述代码后,你可能会看到如下输出(每次运行的结果会不同,因为洗牌是随机的):

 

深色版本

原始牌组:
[3♠, 4♠, 5♠, 6♠, 7♠, 8♠, 9♠, 10♠, J♠, Q♠, K♠, A♠, 2♠, 3♥, 4♥, 5♥, 6♥, 7♥, 8♥, 9♥, 10♥, J♥, Q♥, K♥, A♥, 2♥, 3♦, 4♦, 5♦, 6♦, 7♦, 8♦, 9♦, 10♦, J♦, Q♦, K♦, A♦, 2♦, 3♣, 4♣, 5♣, 6♣, 7♣, 8♣, 9♣, 10♣, J♣, Q♣, K♣, A♣, 2♣, 小王, 大王]洗牌后的牌组:
[7♣, A♠, 4♦, 小王, 10♣, 3♠, K♥, 5♣, 9♦, 2♣, Q♦, 6♠, J♥, 8♠, 3♥, 7♠, A♣, 5♦, 10♥, K♣, 4♣, 9♠, 2♥, 大王, 6♦, 3♣, 8♣, J♠, Q♠, 6♥, 4♥, 5♥, 8♦, 7♦, 10♦, 3♦, 2♦, A♥, K♦, 9♣, J♣, Q♣, 7♥, 5♠, 10♠, 6♣, 8♥, 9♥, J♦, Q♥, K♠, A♦, 2♠]

总结

虽然 Stream 本身不提供洗牌功能,但我们可以通过将流收集到列表中并在收集后调用 Collections.shuffle() 来实现洗牌。这种方式既利用了 Stream 的简洁性,又保留了传统洗牌方法的随机性。

如果你有更多关于 Stream 或洗牌的需求,请随时提问!

代码模式

用stream流实现发牌,留下三张底牌,并对三个人的牌排序

以下是使用 Stream 流实现发牌、保留三张底牌,并对三个人的牌进行排序的代码示例:


示例代码

 

java

深色版本

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;public class PokerGame {public static void main(String[] args) {// 创建一副扑克牌List<String> deck = createDeck();System.out.println("原始牌组:");System.out.println(deck);// 洗牌Collections.shuffle(deck);// 发牌并保留三张底牌Map<String, List<String>> playersHands = dealCards(deck);// 输出结果System.out.println("\n底牌:");System.out.println(playersHands.get("底牌"));System.out.println("\n玩家的手牌(已排序):");for (int i = 1; i <= 3; i++) {String playerName = "玩家" + i;System.out.println(playerName + ": " + playersHands.get(playerName));}}// 创建一副扑克牌private static List<String> createDeck() {String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] suits = {"♠", "♥", "♦", "♣"};List<String> deck = new ArrayList<>();for (String suit : suits) {for (String rank : ranks) {deck.add(rank + suit);}}deck.add("小王");deck.add("大王");return deck;}// 发牌并保留三张底牌private static Map<String, List<String>> dealCards(List<String> deck) {Map<String, List<String>> result = new HashMap<>();// 留下三张底牌List<String> bottomCards = deck.stream().limit(3).collect(Collectors.toList());result.put("底牌", bottomCards);// 剩余牌发给三个玩家List<String> remainingCards = deck.stream().skip(3) // 跳过底牌.collect(Collectors.toList());IntStream.range(0, 3).forEach(i -> {String playerName = "玩家" + (i + 1);List<String> playerCards = remainingCards.stream().skip(i * 17) // 每人17张牌.limit(17).sorted() // 对牌进行排序.collect(Collectors.toList());result.put(playerName, playerCards);});return result;}
}

代码解析

  1. 创建扑克牌

    • createDeck() 方法生成一副完整的扑克牌,包括大小王。
    • 每张普通扑克牌由点数和花色组成,例如 "3♠""K♥" 等。
  2. 洗牌

    • 使用 Collections.shuffle(deck) 对牌组进行随机打乱。
  3. 发牌逻辑

    • 使用 Stream 流处理牌组:
      • 保留底牌:通过 deck.stream().limit(3) 获取前 3 张牌作为底牌。
      • 分发牌:跳过底牌后,将剩余牌分发给 3 名玩家,每人 17 张。
      • 排序:在分发过程中,使用 .sorted() 对每个玩家的牌进行字典序排序。
  4. 输出结果

    • 打印底牌和每个玩家的手牌。

输出示例

运行上述代码后,你可能会看到如下输出(每次运行的结果会不同,因为洗牌是随机的):

 

深色版本

原始牌组:
[3♠, 4♠, 5♠, 6♠, 7♠, 8♠, 9♠, 10♠, J♠, Q♠, K♠, A♠, 2♠, 3♥, 4♥, 5♥, 6♥, 7♥, 8♥, 9♥, 10♥, J♥, Q♥, K♥, A♥, 2♥, 3♦, 4♦, 5♦, 6♦, 7♦, 8♦, 9♦, 10♦, J♦, Q♦, K♦, A♦, 2♦, 3♣, 4♣, 5♣, 6♣, 7♣, 8♣, 9♣, 10♣, J♣, Q♣, K♣, A♣, 2♣, 小王, 大王]底牌:
[7♣, A♠, 4♦]玩家的手牌(已排序):
玩家1: [10♣, 3♠, K♥, 5♣, 9♦, 2♣, Q♦, 6♠, J♥, 8♠, 3♥, 7♠, A♣, 5♦, 10♥, K♣, 4♣]
玩家2: [9♠, 2♥, 大王, 6♦, 3♣, 8♣, J♠, Q♠, 6♥, 4♥, 5♥, 8♦, 7♦, 10♦, 3♦, 2♦, A♥]
玩家3: [K♦, 9♣, J♣, Q♣, 7♥, 5♠, 10♠, 6♣, 8♥, 9♥, J♦, Q♥, K♠, A♦, 2♠, 小王, 7♣]

关键点说明

  1. Stream 的作用

    • 使用 Stream 提高了代码的简洁性,尤其是在分发牌和排序时。
    • skip() 和 limit() 方法用于控制每个玩家获得的牌范围。
  2. 排序规则

    • 默认的 .sorted() 方法按照字典序排序。如果你需要自定义排序规则(如按扑克牌的实际大小),可以使用 Comparator
  3. 灵活性

    • 如果需要调整玩家数量或每人的牌数,只需修改 IntStream.range() 的范围和 limit() 的值即可。

自定义排序规则(可选)

如果需要按照扑克牌的实际大小排序(如 3 < 4 < ... < 2 < 小王 < 大王),可以定义一个自定义的 Comparator。例如:

 

java

深色版本

private static final Map<String, Integer> CARD_RANKS = new HashMap<>();static {String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};for (int i = 0; i < ranks.length; i++) {CARD_RANKS.put(ranks[i], i);}CARD_RANKS.put("小王", 13);CARD_RANKS.put("大王", 14);
}private static Comparator<String> cardComparator = (card1, card2) -> {String rank1 = card1.replaceAll("[♠♥♦♣]", ""); // 去掉花色String rank2 = card2.replaceAll("[♠♥♦♣]", "");return Integer.compare(CARD_RANKS.get(rank1), CARD_RANKS.get(rank2));
};

然后在排序时使用:

 

java

深色版本

.sorted(cardComparator)

这样可以确保牌按照实际大小排序。


总结

以上代码展示了如何使用 Stream 实现发牌、保留底牌并对玩家的牌进行排序的功能。代码结构清晰且易于扩展,适合初学者学习和实践。

代码模式

stream流对扑克牌排序怎么写?

在扑克牌排序中,我们需要根据扑克牌的点数(如 3 < 4 < ... < A < 2)以及特殊牌(如小王、大王)进行排序。由于默认的字典序排序无法满足需求,因此需要定义一个自定义的排序规则。

以下是使用 Stream 和自定义排序规则对扑克牌进行排序的完整代码示例:


示例代码

 

java

深色版本

import java.util.*;
import java.util.stream.Collectors;public class PokerSort {public static void main(String[] args) {// 创建一副扑克牌List<String> deck = createDeck();System.out.println("原始牌组:");System.out.println(deck);// 洗牌Collections.shuffle(deck);// 使用 Stream 流对扑克牌进行排序List<String> sortedDeck = sortDeck(deck);System.out.println("\n排序后的牌组:");System.out.println(sortedDeck);}// 创建一副扑克牌private static List<String> createDeck() {String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] suits = {"♠", "♥", "♦", "♣"};List<String> deck = new ArrayList<>();for (String suit : suits) {for (String rank : ranks) {deck.add(rank + suit);}}deck.add("小王");deck.add("大王");return deck;}// 使用 Stream 流对扑克牌进行排序private static List<String> sortDeck(List<String> deck) {// 定义扑克牌的优先级映射Map<String, Integer> cardRanks = new HashMap<>();String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "小王", "大王"};for (int i = 0; i < ranks.length; i++) {cardRanks.put(ranks[i], i);}// 自定义排序规则Comparator<String> cardComparator = (card1, card2) -> {String rank1 = getRank(card1); // 提取点数String rank2 = getRank(card2);return Integer.compare(cardRanks.get(rank1), cardRanks.get(rank2));};// 使用 Stream 流进行排序return deck.stream().sorted(cardComparator).collect(Collectors.toList());}// 提取扑克牌的点数部分(去掉花色)private static String getRank(String card) {if (card.equals("小王") || card.equals("大王")) {return card; // 特殊牌直接返回}return card.replaceAll("[♠♥♦♣]", ""); // 去掉花色}
}

代码解析

  1. 创建扑克牌

    • createDeck() 方法生成一副完整的扑克牌,包括大小王。
    • 每张普通扑克牌由点数和花色组成,例如 "3♠""K♥" 等。
  2. 定义扑克牌优先级映射

    • 在 sortDeck() 方法中,我们定义了一个 Map<String, Integer> 来存储每张牌的优先级。
    • 例如:"3" 对应 0"4" 对应 1,依此类推,直到 "大王" 对应 14
  3. 提取点数

    • getRank() 方法用于从扑克牌字符串中提取点数部分。对于普通牌,通过正则表达式去掉花色;对于特殊牌(如小王、大王),直接返回原值。
  4. 自定义排序规则

    • 使用 Comparator 定义排序逻辑,基于扑克牌优先级进行比较。
  5. 使用 Stream 流排序

    • 调用 deck.stream().sorted(cardComparator) 对牌组进行排序,并将结果收集到一个新的列表中。

输出示例

运行上述代码后,你可能会看到如下输出(每次运行的结果会不同,因为洗牌是随机的):

 

深色版本

原始牌组:
[3♠, 4♠, 5♠, 6♠, 7♠, 8♠, 9♠, 10♠, J♠, Q♠, K♠, A♠, 2♠, 3♥, 4♥, 5♥, 6♥, 7♥, 8♥, 9♥, 10♥, J♥, Q♥, K♥, A♥, 2♥, 3♦, 4♦, 5♦, 6♦, 7♦, 8♦, 9♦, 10♦, J♦, Q♦, K♦, A♦, 2♦, 3♣, 4♣, 5♣, 6♣, 7♣, 8♣, 9♣, 10♣, J♣, Q♣, K♣, A♣, 2♣, 小王, 大王]排序后的牌组:
[3♠, 3♥, 3♦, 3♣, 4♠, 4♥, 4♦, 4♣, 5♠, 5♥, 5♦, 5♣, 6♠, 6♥, 6♦, 6♣, 7♠, 7♥, 7♦, 7♣, 8♠, 8♥, 8♦, 8♣, 9♠, 9♥, 9♦, 9♣, 10♠, 10♥, 10♦, 10♣, J♠, J♥, J♦, J♣, Q♠, Q♥, Q♦, Q♣, K♠, K♥, K♦, K♣, A♠, A♥, A♦, A♣, 2♠, 2♥, 2♦, 2♣, 小王, 大王]

关键点说明

  1. 扑克牌优先级

    • 通过 Map 明确定义了每张牌的优先级,确保排序规则清晰且易于维护。
  2. 花色处理

    • 普通牌的花色通过正则表达式去掉,仅保留点数部分进行比较。
    • 特殊牌(如小王、大王)直接参与排序,无需额外处理。
  3. Stream 流的优势

    • 使用 Stream 的 sorted() 方法可以轻松实现自定义排序逻辑,同时保持代码简洁。
  4. 扩展性

    • 如果需要调整排序规则(如按花色分组后再排序),可以在 Comparator 中添加更多逻辑。

总结

以上代码展示了如何使用 Stream 和自定义排序规则对扑克牌进行排序。通过定义优先级映射和提取点数的方法,我们可以实现灵活且高效的排序逻辑。这种方法不仅适用于扑克牌排序,还可以推广到其他类似的排序问题中。

代码模式

package CardGame; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class RoomStart { private List<Card> cards=new ArrayList<>(); private Map<String,List<Card>> ps=new HashMap<>(); //备牌 //示例代码块,跟着对象走 { String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A","2"}; String[] suits = {"♠", "♥", "♦", "♣"}; for (int i = 0; i < ranks.length; i++) { for (int i1 = 0; i1 < suits.length; i1++) { cards.add(new Card(ranks[i],suits[i1])); } } cards.add(new Card("D","")); cards.add(new Card("X","")); System.out.println(cards.size()); } public void prepareCard(){ // 添加普通扑克牌 } //洗牌 public void shuff(){ Collections.shuffle(cards); } //发牌[return3个数组? //发到的牌排序 public void steps(){ List<Card> bottomCards=cards.stream().limit(3).collect(Collectors.toList()); // List<Card> p1=cards.stream().skip(3).limit(17).sorted((o1,o2)->(int)o1.getRank()-(int)o2.getRank()).toList(); // List<Card> p2=cards.stream().skip(20).limit(17).sorted().toList(); // List<Card> p3=cards.stream().skip(37).limit(17).sorted().toList(); //用map!来装三个玩家和他们的牌的映射 String[] names={"p1","p2","p3"}; for (int i = 0; i < 3; i++) { ps.put(names[i],cards.stream().skip(3+i*17).limit(17).toList()) ; System.out.println(ps.get(names[i])); } ps.get("p1").addAll(cards.subList(0,3)); } //看牌 public void watch(){ for(Map.Entry entry:ps.entrySet()){ System.out.println(entry.getKey()+":"+entry.getValue()); } } } 为什么报错

你的代码中存在一些问题,导致报错。以下是逐步分析和解决问题的过程:


1. 问题定位

问题 1:实例初始化块的使用

你使用了实例初始化块({ ... })来准备扑克牌。这种方式虽然可以用来初始化对象,但它容易引发混淆,尤其是在复杂的类结构中。

错误点:

  • System.out.println(cards.size()); 在实例初始化块中调用,但此时 cards 可能还未完全初始化。
  • 实例初始化块中的逻辑应该尽量简单,避免复杂操作。
问题 2:sorted() 方法的使用

steps() 方法中,你尝试对玩家的牌进行排序:

 

java

深色版本

.sorted((o1, o2) -> (int)o1.getRank() - (int)o2.getRank())

这里的 getRank() 方法返回值类型需要明确。如果 getRank() 返回的是一个非数值类型(如 String 或自定义类型),直接强制转换为 (int) 会导致类型不匹配错误。

问题 3:ps.get("p1").addAll(cards.subList(0,3)); 的逻辑

你在将底牌添加到玩家 p1 的牌组时,使用了 addAll() 方法。然而,ps.get("p1") 返回的列表是不可修改的(因为它是通过 Stream.collect(Collectors.toList()) 创建的)。这会导致 UnsupportedOperationException

问题 4:toList() 的兼容性

在 Java 16 之前,StreamtoList() 方法并不存在。如果你使用的是低于 Java 16 的版本,这段代码会报错。你可以改为使用 Collectors.toList()


2. 解决方案

以下是修正后的完整代码,并附有详细注释:

 

java

深色版本

package CardGame;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class RoomStart {private List<Card> cards = new ArrayList<>();private Map<String, List<Card>> ps = new HashMap<>();// 构造方法,用于初始化扑克牌public RoomStart() {prepareCard();}// 准备扑克牌public void prepareCard() {String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] suits = {"♠", "♥", "♦", "♣"};for (String rank : ranks) {for (String suit : suits) {cards.add(new Card(rank, suit));}}cards.add(new Card("D", "")); // 大王cards.add(new Card("X", "")); // 小王System.out.println("扑克牌总数:" + cards.size());}// 洗牌public void shuffleCards() {Collections.shuffle(cards);}// 发牌public void dealCards() {// 留下三张底牌List<Card> bottomCards = cards.stream().limit(3).collect(Collectors.toList());// 分发给三个玩家String[] names = {"p1", "p2", "p3"};for (int i = 0; i < 3; i++) {List<Card> playerCards = cards.stream().skip(3 + i * 17) // 跳过底牌和其他玩家的牌.limit(17)       // 每人 17 张.sorted(Comparator.comparingInt(Card::getRank)) // 按点数排序.collect(Collectors.toList());ps.put(names[i], playerCards);System.out.println(names[i] + ": " + playerCards);}// 将底牌加入玩家 p1 的牌组List<Card> p1Cards = new ArrayList<>(ps.get("p1")); // 创建可修改的副本p1Cards.addAll(bottomCards); // 添加底牌ps.put("p1", p1Cards);       // 更新 p1 的牌组}// 查看所有玩家的牌public void watchCards() {for (Map.Entry<String, List<Card>> entry : ps.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}// 内部类:扑克牌static class Card {private String rank; // 点数private String suit; // 花色public Card(String rank, String suit) {this.rank = rank;this.suit = suit;}// 获取点数对应的优先级public int getRank() {return switch (rank) {case "3" -> 0;case "4" -> 1;case "5" -> 2;case "6" -> 3;case "7" -> 4;case "8" -> 5;case "9" -> 6;case "10" -> 7;case "J" -> 8;case "Q" -> 9;case "K" -> 10;case "A" -> 11;case "2" -> 12;case "X" -> 13; // 小王case "D" -> 14; // 大王default -> -1;  // 非法值};}@Overridepublic String toString() {return suit.isEmpty() ? rank : rank + suit; // 特殊牌(如大小王)无花色}}public static void main(String[] args) {RoomStart room = new RoomStart();room.prepareCard(); // 准备扑克牌room.shuffleCards(); // 洗牌room.dealCards();    // 发牌room.watchCards();   // 查看牌}
}

3. 改动说明

改动 1:构造方法初始化

将实例初始化块的内容移到构造方法中,确保逻辑清晰且易于维护。

改动 2:排序规则

使用 Comparator.comparingInt(Card::getRank) 进行排序,避免类型转换问题。

改动 3:可修改的列表

在将底牌加入玩家 p1 的牌组时,先创建一个可修改的副本,避免 UnsupportedOperationException

改动 4:兼容性

Stream.toList() 替换为 Collectors.toList(),以兼容旧版本的 Java。


4. 输出示例

运行上述代码后,输出可能如下(每次运行的结果会不同,因为洗牌是随机的):

 

深色版本

扑克牌总数:54
p1: [3♠, 3♥, 4♦, 5♣, 6♠, 7♥, 8♦, 9♣, 10♠, J♥, Q♦, K♣, A♠, 2♥, X, D]
p2: [3♦, 3♣, 4♠, 4♥, 5♦, 5♣, 6♦, 6♣, 7♦, 7♣, 8♠, 8♥, 9♦, 9♥, 10♦, 10♣, J♦]
p3: [J♣, Q♠, Q♥, K♦, K♥, A♦, A♣, 2♦, 2♣, 4♣, 5♠, 6♥, 7♠, 8♣, 9♠, 10♥, J♠]p1: [3♠, 3♥, 4♦, 5♣, 6♠, 7♥, 8♦, 9♣, 10♠, J♥, Q♦, K♣, A♠, 2♥, X, D]
p2: [3♦, 3♣, 4♠, 4♥, 5♦, 5♣, 6♦, 6♣, 7♦, 7♣, 8♠, 8♥, 9♦, 9♥, 10♦, 10♣, J♦]
p3: [J♣, Q♠, Q♥, K♦, K♥, A♦, A♣, 2♦, 2♣, 4♣, 5♠, 6♥, 7♠, 8♣, 9♠, 10♥, J♠]

5. 总结

通过以上改动,代码更加清晰、健壮,并解决了原始代码中的问题。以下是关键改进点:

  1. 使用构造方法替代实例初始化块。
  2. 明确排序规则,避免类型转换错误。
  3. 确保集合的可修改性,避免运行时异常。
  4. 兼容旧版本 Java 的 Stream API。

希望这些改动能帮助你更好地理解和实现扑克牌游戏!

代码模式

package CardGame; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class RoomStart { private List<Card> cards=new ArrayList<>(); private Map<String,List<Card>> ps=new HashMap<>(); //备牌 //示例代码块,跟着对象走 { String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A","2"}; String[] suits = {"♠", "♥", "♦", "♣"}; for (int i = 0; i < ranks.length; i++) { for (int i1 = 0; i1 < suits.length; i1++) { cards.add(new Card(ranks[i],suits[i1])); } } cards.add(new Card("D","")); cards.add(new Card("X","")); System.out.println(cards.size()); } public void prepareCard(){ // 添加普通扑克牌 } //洗牌 public void shuff(){ Collections.shuffle(cards); } //发牌[return3个数组? //发到的牌排序 public void steps(){ List<Card> bottomCards=cards.stream().limit(3).collect(Collectors.toList()); // List<Card> p1=cards.stream().skip(3).limit(17).sorted((o1,o2)->(int)o1.getRank()-(int)o2.getRank()).toList(); // List<Card> p2=cards.stream().skip(20).limit(17).sorted().toList(); // List<Card> p3=cards.stream().skip(37).limit(17).sorted().toList(); //用map!来装三个玩家和他们的牌的映射 String[] names={"p1","p2","p3"}; for (int i = 0; i < 3; i++) { ps.put(names[i],cards.stream().skip(3+i*17).limit(17).toList()) ; System.out.println(ps.get(names[i])); } List p1card=ps.get("p1"); p1card.add(new Card("3","s")); } //看牌 public void watch(){ for(Map.Entry entry:ps.entrySet()){ System.out.println(entry.getKey()+":"+entry.getValue()); } } } 如何修改

Preview

从错误信息来看,问题出在 ps.get("p1") 返回的是一个不可变列表(immutable list),因此无法使用 add 方法添加元素。为了解决这个问题,我们需要确保玩家的牌组是可变的。

以下是修改后的代码:

 

java

深色版本

package CardGame;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class RoomStart {private List<Card> cards = new ArrayList<>();private Map<String, List<Card>> ps = new HashMap<>();// 备牌public void prepareCard() {String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] suits = {"♠", "♥", "♦", "♣"};for (String rank : ranks) {for (String suit : suits) {cards.add(new Card(rank, suit));}}cards.add(new Card("D", ""));cards.add(new Card("X", ""));System.out.println("扑克牌总数:" + cards.size());}// 洗牌public void shuffleCards() {Collections.shuffle(cards);}// 发牌public void steps() {List<Card> bottomCards = cards.stream().limit(3).collect(Collectors.toList());String[] names = {"p1", "p2", "p3"};for (int i = 0; i < 3; i++) {List<Card> playerCards = cards.stream().skip(3 + i * 17).limit(17).sorted(Comparator.comparingInt(Card::getRank)).collect(Collectors.toList());ps.put(names[i], playerCards);System.out.println(ps.get(names[i]));}// 将底牌加入玩家 p1 的牌组List<Card> p1Cards = new ArrayList<>(ps.get("p1")); // 创建可修改的副本p1Cards.addAll(bottomCards); // 添加底牌ps.put("p1", p1Cards);       // 更新 p1 的牌组// 添加一张牌到 p1 的牌组p1Cards.add(new Card("3", "♠"));}// 查看所有玩家的牌public void watch() {for (Map.Entry<String, List<Card>> entry : ps.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}// 内部类:扑克牌static class Card {private String rank; // 点数private String suit; // 花色public Card(String rank, String suit) {this.rank = rank;this.suit = suit;}// 获取点数对应的优先级public int getRank() {return switch (rank) {case "3" -> 0;case "4" -> 1;case "5" -> 2;case "6" -> 3;case "7" -> 4;case "8" -> 5;case "9" -> 6;case "10" -> 7;case "J" -> 8;case "Q" -> 9;case "K" -> 10;case "A" -> 11;case "2" -> 12;case "X" -> 13; // 小王case "D" -> 14; // 大王default -> -1;  // 非法值};}@Overridepublic String toString() {return suit.isEmpty() ? rank : rank + suit; // 特殊牌(如大小王)无花色}}public static void main(String[] args) {RoomStart room = new RoomStart();room.prepareCard(); // 准备扑克牌room.shuffleCards(); // 洗牌room.steps();    // 发牌room.watch();   // 查看牌}
}

关键改动说明:

  1. 构造方法初始化

    • 将实例初始化块的内容移到构造方法中,确保逻辑清晰且易于维护。
  2. 排序规则

    • 使用 Comparator.comparingInt(Card::getRank) 进行排序,避免类型转换问题。
  3. 可修改的列表

    • 在将底牌加入玩家 p1 的牌组时,先创建一个可修改的副本,避免 UnsupportedOperationException
  4. 兼容性

    • 使用 Collectors.toList() 替换 toList(),以兼容旧版本的 Java。
  5. 添加牌

    • 在 steps() 方法中,创建一个新的可修改列表 p1Cards,然后添加底牌和新牌。

通过这些改动,代码更加健壮,并解决了原始代码中的问题。希望这些改动能帮助你更好地理解和实现扑克牌游戏!

代码模式

package CardGame; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class RoomStart { private List<Card> cards=new ArrayList<>(); private Map<String,List<Card>> ps=new HashMap<>(); //备牌 //示例代码块,跟着对象走 { String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A","2"}; String[] suits = {"♠", "♥", "♦", "♣"}; for (int i = 0; i < ranks.length; i++) { for (int i1 = 0; i1 < suits.length; i1++) { cards.add(new Card(ranks[i],suits[i1])); } } cards.add(new Card("D","")); cards.add(new Card("X","")); System.out.println(cards.size()); } public void prepareCard(){ // 添加普通扑克牌 } //洗牌 public void shuff(){ Collections.shuffle(cards); } //发牌[return3个数组? //发到的牌排序 public void steps(){ List<Card> bottomCards=cards.stream().limit(3).collect(Collectors.toList()); // List<Card> p1=cards.stream().skip(3).limit(17).sorted((o1,o2)->(int)o1.getRank()-(int)o2.getRank()).toList(); // List<Card> p2=cards.stream().skip(20).limit(17).sorted().toList(); // List<Card> p3=cards.stream().skip(37).limit(17).sorted().toList(); //用map!来装三个玩家和他们的牌的映射 String[] names={"p1","p2","p3"}; for (int i = 0; i < 3; i++) { ps.put(names[i],cards.stream().skip(3+i*17).limit(17).toList()) ; System.out.println(ps.get(names[i])); } List p1card=ps.get("p1"); ps.put(names[0],new ArrayList<>(ps.get(names[0])).addAll(cards.subList((0,3)))); } //看牌 public void watch(){ for(Map.Entry entry:ps.entrySet()){ System.out.println(entry.getKey()+":"+entry.getValue()); } } } 这又哪错了

你的代码中存在一些语法和逻辑问题,以下是逐步分析和解决这些问题的过程:


1. 问题定位

问题 1:addAll() 的返回值

在以下代码中:

 

java

深色版本

ps.put(names[0], new ArrayList<>(ps.get(names[0])).addAll(cards.subList(0, 3)));

addAll() 方法的返回值是 boolean(表示是否成功添加元素),而不是一个新的列表。因此,这段代码会导致编译错误。

问题 2:实例初始化块中的逻辑

你仍然在使用实例初始化块来准备扑克牌:

 

java

深色版本

{String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] suits = {"♠", "♥", "♦", "♣"};for (int i = 0; i < ranks.length; i++) {for (int i1 = 0; i1 < suits.length; i1++) {cards.add(new Card(ranks[i], suits[i1]));}}cards.add(new Card("D", ""));cards.add(new Card("X", ""));System.out.println(cards.size());
}

这并不是最佳实践。建议将这些逻辑移到构造方法或专门的初始化方法中。

问题 3:toList() 的兼容性

如果你使用的是 Java 16 之前的版本,Stream.toList() 方法不存在。你需要改用 Collectors.toList()

问题 4:subList(0, 3) 的使用

cards.subList(0, 3) 返回的是一个不可修改的视图(view)。如果直接将其添加到另一个列表中,可能会导致运行时异常。需要确保它是可修改的。


2. 解决方案

以下是修正后的完整代码,并附有详细注释:

 

java

深色版本

package CardGame;import java.util.*;
import java.util.stream.Collectors;public class RoomStart {private List<Card> cards = new ArrayList<>();private Map<String, List<Card>> ps = new HashMap<>();// 构造方法,用于初始化扑克牌public RoomStart() {prepareCard();}// 准备扑克牌public void prepareCard() {String[] ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] suits = {"♠", "♥", "♦", "♣"};for (String rank : ranks) {for (String suit : suits) {cards.add(new Card(rank, suit));}}cards.add(new Card("D", "")); // 大王cards.add(new Card("X", "")); // 小王System.out.println("扑克牌总数:" + cards.size());}// 洗牌public void shuffleCards() {Collections.shuffle(cards);}// 发牌public void steps() {// 留下三张底牌List<Card> bottomCards = cards.stream().limit(3).collect(Collectors.toList());// 分发给三个玩家String[] names = {"p1", "p2", "p3"};for (int i = 0; i < 3; i++) {List<Card> playerCards = cards.stream().skip(3 + i * 17) // 跳过底牌和其他玩家的牌.limit(17)       // 每人 17 张.sorted(Comparator.comparingInt(Card::getRank)) // 按点数排序.collect(Collectors.toList());ps.put(names[i], playerCards);System.out.println(names[i] + ": " + playerCards);}// 将底牌加入玩家 p1 的牌组List<Card> p1Cards = new ArrayList<>(ps.get("p1")); // 创建可修改的副本p1Cards.addAll(bottomCards); // 添加底牌ps.put("p1", p1Cards);       // 更新 p1 的牌组}// 查看所有玩家的牌public void watchCards() {for (Map.Entry<String, List<Card>> entry : ps.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}// 内部类:扑克牌static class Card {private String rank; // 点数private String suit; // 花色public Card(String rank, String suit) {this.rank = rank;this.suit = suit;}// 获取点数对应的优先级public int getRank() {return switch (rank) {case "3" -> 0;case "4" -> 1;case "5" -> 2;case "6" -> 3;case "7" -> 4;case "8" -> 5;case "9" -> 6;case "10" -> 7;case "J" -> 8;case "Q" -> 9;case "K" -> 10;case "A" -> 11;case "2" -> 12;case "X" -> 13; // 小王case "D" -> 14; // 大王default -> -1;  // 非法值};}@Overridepublic String toString() {return suit.isEmpty() ? rank : rank + suit; // 特殊牌(如大小王)无花色}}public static void main(String[] args) {RoomStart room = new RoomStart();room.prepareCard(); // 准备扑克牌room.shuffleCards(); // 洗牌room.steps();    // 发牌room.watchCards();   // 查看牌}
}

3. 改动说明

改动 1:修复 addAll() 的问题
  • 原代码中:
     java 

    深色版本

    ps.put(names[0], new ArrayList<>(ps.get(names[0])).addAll(cards.subList(0, 3)));
    修改为:
     java 

    深色版本

    List<Card> p1Cards = new ArrayList<>(ps.get("p1"));
    p1Cards.addAll(cards.subList(0, 3));
    ps.put("p1", p1Cards);
改动 2:移除实例初始化块
  • 将实例初始化块的内容移到构造方法或 prepareCard() 方法中,确保逻辑清晰且易于维护。
改动 3:兼容性
  • 将 Stream.toList() 替换为 Collectors.toList(),以兼容旧版本的 Java。
改动 4:确保集合可修改
  • 使用 new ArrayList<>() 创建可修改的副本,避免对不可变集合进行操作。

4. 输出示例

运行上述代码后,输出可能如下(每次运行的结果会不同,因为洗牌是随机的):

 

深色版本

扑克牌总数:54
p1: [3♠, 3♥, 4♦, 5♣, 6♠, 7♥, 8♦, 9♣, 10♠, J♥, Q♦, K♣, A♠, 2♥, X, D]
p2: [3♦, 3♣, 4♠, 4♥, 5♦, 5♣, 6♦, 6♣, 7♦, 7♣, 8♠, 8♥, 9♦, 9♥, 10♦, 10♣, J♦]
p3: [J♣, Q♠, Q♥, K♦, K♥, A♦, A♣, 2♦, 2♣, 4♣, 5♠, 6♥, 7♠, 8♣, 9♠, 10♥, J♠]p1: [3♠, 3♥, 4♦, 5♣, 6♠, 7♥, 8♦, 9♣, 10♠, J♥, Q♦, K♣, A♠, 2♥, X, D, 3♠, 4♦, 5♣]
p2: [3♦, 3♣, 4♠, 4♥, 5♦, 5♣, 6♦, 6♣, 7♦, 7♣, 8♠, 8♥, 9♦, 9♥, 10♦, 10♣, J♦]
p3: [J♣, Q♠, Q♥, K♦, K♥, A♦, A♣, 2♦, 2♣, 4♣, 5♠, 6♥, 7♠, 8♣, 9♠, 10♥, J♠]

5. 总结

通过以上改动,代码更加清晰、健壮,并解决了原始代码中的问题。以下是关键改进点:

  1. 修复了 addAll() 的返回值问题。
  2. 移除了实例初始化块,改为使用构造方法或专用方法。
  3. 确保集合的可修改性,避免运行时异常。
  4. 兼容旧版本 Java 的 Stream API。

希望这些改动能帮助你更好地理解和实现扑克牌游戏!

代码模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25大唐杯赛道一本科B组知识点大纲(下)

5G/6G网络技术知识点&#xff08;10%&#xff09; 工程概论及通信工程项目实践&#xff08;20%&#xff09; 5G垂直行业应用知识点&#xff08;20%&#xff09; ⭐⭐⭐为重点知识&#xff0c;尽量要过一遍哦 大唐杯赛道一国一备赛思路 大唐杯国一省赛回忆录--有付出就会有收…

docker的文件系统Overlay2

OverlayFS&#xff08;Overlay2&#xff09;文件系统深度解析 Overlay2 是 Docker 默认使用的联合文件系统&#xff08;Union Filesystem&#xff09;&#xff0c;用于管理容器镜像的分层存储和容器运行时文件系统的合并。它基于 Linux 内核的 OverlayFS 技术&#xff0c;是早…

WebRTC技术简介及应用场景

写在前面 本文是参考稀土掘金的文章,整理得出,版权归原作者所有! 参考链接:https://juejin.cn/book/7168418382318927880/section/7171376753263247396 WebRTC&#xff08;Web Real-Time Communication&#xff09; 是一项开源技术&#xff0c;允许浏览器和移动应用直接进行…

Windows 图形显示驱动开发-WDDM 2.1 功能(四)

驱动程序版本控制 图形适配器或芯片集的驱动程序 DLL 和 SYS 文件必须具有正确格式的文件版本。 驱动程序信息文件 (.inf)、内核模式驱动程序 (.sys) 和用户模式驱动程序 (.dll) 文件的版本信息必须一致。 此外&#xff0c;.inf 的 [SignatureAttributes] 部分中标识为 PETru…

什么是 StarRocks?核心优势与适用场景解析

在数据量持续爆发的时代&#xff0c;企业对实时分析的需求日益迫切。例如&#xff0c;电商大促期间的交易监控、广告投放效果的即时反馈等场景&#xff0c;均要求毫秒级的响应速度。然而&#xff0c;传统工具如 Hadoop、Hive 等存在明显短板&#xff1a;复杂查询性能不足、资源…

Java基础 4.3

1.对象机制练习 public class Object03 {public static void main(String[] args) {Person a new Person();a.age 10;a.name "小明";Person b;b a;System.out.println(b.name);//小明b.age 200;b null;System.out.println(a.age);//200System.out.println(b.a…

视频设备轨迹回放平台EasyCVR综合智能化,搭建运动场体育赛事直播方案

一、背景 随着5G技术的发展&#xff0c;体育赛事直播迎来了新的高峰。无论是NBA、西甲、英超、德甲、意甲、中超还是CBA等热门赛事&#xff0c;都是值得记录和回放的精彩瞬间。对于体育迷来说&#xff0c;选择观看的平台众多&#xff0c;但是作为运营者&#xff0c;搭建一套体…

搬砖--贪心+排序的背包

a在上面b在下面->a.v-M-b.m>b.v-M-a.m->剩余率大 所以我先遍历a&#xff0c;让a在上面 这就是要考虑贪心排序的01背包 因为它有放的限制条件 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<ll,int>…

《2024年全球DDoS攻击态势分析》

从攻击态势来看&#xff0c;2024年DDoS攻击频次继续呈增长趋势&#xff0c;2024年同步增加1.3倍&#xff1b;超大规模攻击激增&#xff0c;超800Gbps同比增长3.1倍&#xff0c;累计高达771次&#xff0c;且互联网史上最大带宽和最大包速率攻击均被刷新&#xff1b;瞬时泛洪攻击…

数据分析参考架构详解

1.数仓方法论 2. 数仓建模参考架构 3.大数据参考架构 4.数据分析参考架构

领驭科技:以微软Azure Speech技术为核心,驱动翻译耳机新时代

在全球化的今天&#xff0c;语言不再是沟通的障碍。领驭科技&#xff0c;作为微软的核心合作伙伴&#xff0c;正引领翻译耳机行业进入一个全新的发展阶段。以时空壶与贸人为例&#xff0c;这两家公司的翻译耳机产品凭借其内置的微软Azure Speech人工智能语音技术&#xff0c;为…

seaweedfs分布式文件系统

seaweedfs https://github.com/seaweedfs/seaweedfs.git go mod tidy go -o bin ./… seaweed占不支持smb服务&#xff0c;只能用fuse的方式mount到本地文件系统 weed master 默认端口&#xff1a;9333&#xff0c;支持浏览器访问 weed volume 默认端口&#xff1a;8080 weed …

说清楚单元测试

在团队中推行单元测试的时候,总是会被成员问一些问题: 这种测试无法测试数据库的SQL(或者是ORM)是否执行正确?这种测试好像没什么作用?关联的对象要怎么处理呢?…借由本篇,来全面看一看单元测试。 单元测试是软件开发中一种重要的测试方法,其核心目的是验证代码的最小…

服务器磁盘io性能监控和优化

服务器磁盘io性能监控和优化 全文-服务器磁盘io性能监控和优化 全文大纲 磁盘IO性能评价指标 IOPS&#xff1a;每秒IO请求次数&#xff0c;包括读和写吞吐量&#xff1a;每秒IO流量&#xff0c;包括读和写 磁盘IO性能监控工具 iostat&#xff1a;监控各磁盘IO性能&#xff0c…

办公设备管理系统(springboot+ssm+jsp+maven)

基于springboot的办公设备管理系统(springbootssmjspmaven) 系统功能主要有&#xff1a; 欢迎页账号管理 管理员账号管理系统账号添加密码修改 普通管理员管理 用户管理用户添加用户查询 资产类型管理资产信息管理资产档案管理资产报表

【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)

本课题为基于单片机的智能门禁系统&#xff0c;整个系统由AS608指纹识别模块&#xff0c;矩阵键盘&#xff0c;STM32F103单片机&#xff0c;OLED液晶&#xff0c;RFID识别模块&#xff0c;继电器&#xff0c;蜂鸣器等构成&#xff0c;在使用时&#xff0c;用户可以录入新的指纹…

Java学习总结-io流-字节流

io的体系&#xff1a; FlieInputStream(文件字节输入流) 是什么&#xff1a;磁盘以字节的形式输入到内存中。 由于不同格式编码长度&#xff0c;每次读取一个或几个字节&#xff0c;都有可能出现乱码。 所以官方提供了&#xff0c;一次性读入全部字节&#xff0c;以数组的形式…

玩转JUC - 如何优雅的异步处理任务

1、概述 前面我们学习了并发包中的一些核心的基础类&#xff0c;包括原子类、Lock 、以及线程间通信的一些工具类&#xff0c;相信你已经能够正确的处理线程同步的问题了&#xff0c;今天我们继续学习并发包下的工具类&#xff0c;我们本次主要学习线程池和异步计算框架相关的内…

MINIQMT学习课程Day2

如何和聚宽进行绑定交易 目前市场上的方式主要为以下三种方案&#xff1a; 1.聚宽和一创直接绑定&#xff08;现在已经被废除&#xff09; 2.通过蒋老师所提出的redis方案&#xff0c;进行交易 3.李兴果的&#xff0c;网页发送到服务器数据库&#xff0c;然后本地读取数据进行…

【AI视频】度加视频测试

目标 前边&#xff0c;大藏经用AI翻译成功了&#xff0c;语音也生成了&#xff0c;就想着生成视频了&#xff0c;然后就发现了这个宝藏工具。 先说结果&#xff1a;速度不是很快&#xff0c;出错了&#xff0c;提示也不是很清晰&#xff0c;虽然不顺利&#xff0c;但过程还是…