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.pswp.cn/web/74446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74446.shtml
英文地址,請注明出處:http://en.pswp.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;但過程還是…