From 4626bc4dc242f053db3b07cc74e5d289ae152126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=96=A2=20=E5=A4=A7=E8=BC=9D?= Date: Thu, 13 Jul 2023 15:55:25 +0900 Subject: [PATCH 1/2] =?UTF-8?q?paiza=20B107=E3=81=AE=E5=9B=9E=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dseki/paiza/src/Card.java | 55 ++++++++++++++++ dseki/paiza/src/CardShuffle.java | 72 +++++++++++++++++++++ dseki/paiza/test/CardShuffleTest.java | 24 +++++++ dseki/paiza/test/CardTest.java | 90 +++++++++++++++++++++++++++ 4 files changed, 241 insertions(+) create mode 100644 dseki/paiza/src/Card.java create mode 100644 dseki/paiza/src/CardShuffle.java create mode 100644 dseki/paiza/test/CardShuffleTest.java create mode 100644 dseki/paiza/test/CardTest.java diff --git a/dseki/paiza/src/Card.java b/dseki/paiza/src/Card.java new file mode 100644 index 0000000..fd506e0 --- /dev/null +++ b/dseki/paiza/src/Card.java @@ -0,0 +1,55 @@ +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * カードクラス. + */ +public class Card { + + /** + * 二次元リストから一次元リストに変更するメソッド. + * + * @param twoDimensionalList 変更したい二次元リスト + * @return 変更後の一次元リストを返す + */ + public List createOneDimensionalList(final List> twoDimensionalList) { + final List oneDimensionalList = new ArrayList(); + for (int i = 0; i < twoDimensionalList.size(); i++) { + for (int j = 0; j < twoDimensionalList.get(i).size(); j++) { + oneDimensionalList.add(twoDimensionalList.get(i).get(j)); + } + } + return oneDimensionalList; + } + + /** + * カードのグループを作成するメソッド. + * + * @param cardList カードが格納されているリスト + * @param quantityPerSet 何枚で1グループとするかを表す数値 + * @return グループ化した二次元リストを返す + */ + public List> createGroupOfCards(final List cardList, + final int quantityPerSet) { + final List> groupOfCards = new ArrayList>(); + for (int i = 0; i < cardList.size(); i += quantityPerSet) { + groupOfCards.add(cardList.subList(i, Math.min(i + quantityPerSet, cardList.size()))); + } + return groupOfCards; + } + + /** + * カードのリストを作成するメソッド. + * + * @param numberOfCard カードの枚数 + * @return カードが格納されているリストを返す + */ + public List createCardList(final int numberOfCard) { + final List cardList = new LinkedList<>(); + for (int i = 1; i <= numberOfCard; i++) { + cardList.add(i); + } + return cardList; + } +} \ No newline at end of file diff --git a/dseki/paiza/src/CardShuffle.java b/dseki/paiza/src/CardShuffle.java new file mode 100644 index 0000000..0191968 --- /dev/null +++ b/dseki/paiza/src/CardShuffle.java @@ -0,0 +1,72 @@ +import java.util.List; +import java.util.Scanner; + +/** + * カードをシャッフルするクラス. + */ +public class CardShuffle { + private final int numberOfCard; // カードの枚数 + private final int quantityPerSet; // 何枚のグループにするか + private final int numberOfShuffles; // シャッフルする回数 + private final Card card = new Card(); + + CardShuffle(final int numberOfCard, final int quantityPerSet, final int numberOfShuffles) { + this.numberOfCard = numberOfCard; + this.quantityPerSet = quantityPerSet; + this.numberOfShuffles = numberOfShuffles; + } + + /** + * メインメソッド. + */ + public static void main(final String[] args) { + final Scanner sc = new Scanner(System.in); + final int numberOfCard = sc.nextInt(); + final int quantityPerSet = sc.nextInt(); + final int numberOfShuffles = sc.nextInt(); + final CardShuffle cardShuffle = new CardShuffle(numberOfCard, + quantityPerSet, + numberOfShuffles); + final List cardAfterShuffle = cardShuffle.repeatShuffle(); + for (int i = 0; i < cardAfterShuffle.size(); i++) { + System.out.println(cardAfterShuffle.get(i)); + } + sc.close(); + } + + /** + * カードのシャッフルを繰り返すメソッド. + * + * @return 繰り返しシャッフルを行った1次元リストを返す + */ + List repeatShuffle() { + final List cardList = card.createCardList(this.numberOfCard); + List> shuffledCardsList = shuffleCardsOnce(cardList); + List cardListAfterShuffle = card.createOneDimensionalList(shuffledCardsList); + + for (int i = 0; i < this.numberOfShuffles - 1; i++) { + shuffledCardsList = shuffleCardsOnce(cardListAfterShuffle); + cardListAfterShuffle = card.createOneDimensionalList(shuffledCardsList); + } + return cardListAfterShuffle; + } + + /** + * カードを1回シャッフルするメソッド. + * + * @param cardList カードが格納されているリスト + * @return シャッフルしたカードがグループ化されているままの二次元リストを返す + */ + private List> shuffleCardsOnce(final List cardList) { + final List> groupOfCards = card.createGroupOfCards(cardList, this.quantityPerSet); + final int cardGroupSize = groupOfCards.size() - 1; + final int numberOfTimesToReplace = groupOfCards.size() / 2; + + for (int i = 0; i < numberOfTimesToReplace; i++) { + final List strageCardList = groupOfCards.get(i); + groupOfCards.set(i, groupOfCards.get(cardGroupSize - i)); + groupOfCards.set(cardGroupSize - i, strageCardList); + } + return groupOfCards; + } +} diff --git a/dseki/paiza/test/CardShuffleTest.java b/dseki/paiza/test/CardShuffleTest.java new file mode 100644 index 0000000..0a3056d --- /dev/null +++ b/dseki/paiza/test/CardShuffleTest.java @@ -0,0 +1,24 @@ +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +public class CardShuffleTest { + + @Test + public void repeatShuffleで9枚のカードを3グループに分けて1回シャッフルした結果を取得する() { + CardShuffle cardShuffle = new CardShuffle(9, 3, 1); + List actual = cardShuffle.repeatShuffle(); + List expected = Arrays.asList(7, 8, 9, 4, 5, 6, 1, 2, 3); + assertThat(actual, is(expected)); + } + + @Test + public void repeatShuffleで10枚のカードを3グループに分けて2回シャッフルした結果を取得する() { + CardShuffle cardShuffle = new CardShuffle(10, 3, 2); + List actual = cardShuffle.repeatShuffle(); + List expected = Arrays.asList(3, 6, 1, 2, 9, 4, 5, 10, 7, 8); + assertThat(actual, is(expected)); + } +} diff --git a/dseki/paiza/test/CardTest.java b/dseki/paiza/test/CardTest.java new file mode 100644 index 0000000..6b6ee5f --- /dev/null +++ b/dseki/paiza/test/CardTest.java @@ -0,0 +1,90 @@ +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +public class CardTest { + + @Test + public void createOneDimensionalList5枚のカードがグループ化された二次元リストを一次元リストにする() { + Card card = new Card(); + List firstList = Arrays.asList(1, 2); + List secondList = Arrays.asList(3, 4); + List thirdList = Arrays.asList(5); + List> twoDimensionalList = new ArrayList>(); + twoDimensionalList.add(firstList); + twoDimensionalList.add(secondList); + twoDimensionalList.add(thirdList); + List actual = card.createOneDimensionalList(twoDimensionalList); + List expected = Arrays.asList(1, 2, 3, 4, 5); + assertThat(actual, is(expected)); + } + + @Test + public void createOneDimensionalList10枚のカードがグループ化された二次元リストを一次元リストにする() { + Card card = new Card(); + List firstList = Arrays.asList(1, 2, 3); + List secondList = Arrays.asList(4, 5, 6); + List thirdList = Arrays.asList(7, 8, 9); + List fourthList = Arrays.asList(10); + List> twoDimensionalList = new ArrayList>(); + twoDimensionalList.add(firstList); + twoDimensionalList.add(secondList); + twoDimensionalList.add(thirdList); + twoDimensionalList.add(fourthList); + List actual = card.createOneDimensionalList(twoDimensionalList); + List expected = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + assertThat(actual, is(expected)); + } + + @Test + public void createGroupOfCardsで5枚のカードを2枚ずつのグループにする() { + Card card = new Card(); + List cardList = Arrays.asList(1, 2, 3, 4, 5); + List> actual = card.createGroupOfCards(cardList, 2); + List firstList = Arrays.asList(1, 2); + List secondList = Arrays.asList(3, 4); + List thirdList = Arrays.asList(5); + List> expected = new ArrayList>(); + expected.add(firstList); + expected.add(secondList); + expected.add(thirdList); + assertThat(actual, is(expected)); + } + + @Test + public void createGroupOfCardsで10枚のカードを3枚ずつのグループにする() { + Card card = new Card(); + List cardList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + List> actual = card.createGroupOfCards(cardList, 3); + List firstList = Arrays.asList(1, 2, 3); + List secondList = Arrays.asList(4, 5, 6); + List thirdList = Arrays.asList(7, 8, 9); + List fourthList = Arrays.asList(10); + List> expected = new ArrayList>(); + expected.add(firstList); + expected.add(secondList); + expected.add(thirdList); + expected.add(fourthList); + assertThat(actual, is(expected)); + } + + @Test + public void createCardListでカード5枚のリストを取得する() { + Card card = new Card(); + List actual = card.createCardList(5); + List expected = Arrays.asList(1, 2, 3, 4, 5); + assertThat(actual, is(expected)); + } + + @Test + public void createCardListでカード10枚のリストを取得する() { + Card card = new Card(); + List actual = card.createCardList(10); + List expected = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + assertThat(actual, is(expected)); + } + +} -- GitLab From 6bc242d0bd218c2c7fdd9570aabe598ee947b3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=96=A2=20=E5=A4=A7=E8=BC=9D?= Date: Thu, 13 Jul 2023 17:51:00 +0900 Subject: [PATCH 2/2] =?UTF-8?q?paiza=20B107=20=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dseki/paiza/src/Card.java | 11 +++++++---- dseki/paiza/src/CardShuffle.java | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/dseki/paiza/src/Card.java b/dseki/paiza/src/Card.java index fd506e0..37f7b34 100644 --- a/dseki/paiza/src/Card.java +++ b/dseki/paiza/src/Card.java @@ -15,9 +15,10 @@ public class Card { */ public List createOneDimensionalList(final List> twoDimensionalList) { final List oneDimensionalList = new ArrayList(); - for (int i = 0; i < twoDimensionalList.size(); i++) { - for (int j = 0; j < twoDimensionalList.get(i).size(); j++) { - oneDimensionalList.add(twoDimensionalList.get(i).get(j)); + for (int outerIndex = 0; outerIndex < twoDimensionalList.size(); outerIndex++) { + for (int innerIndex = 0; innerIndex < twoDimensionalList.get(outerIndex).size(); + innerIndex++) { + oneDimensionalList.add(twoDimensionalList.get(outerIndex).get(innerIndex)); } } return oneDimensionalList; @@ -34,7 +35,9 @@ public class Card { final int quantityPerSet) { final List> groupOfCards = new ArrayList>(); for (int i = 0; i < cardList.size(); i += quantityPerSet) { - groupOfCards.add(cardList.subList(i, Math.min(i + quantityPerSet, cardList.size()))); + final int upToWhatNumber = Math.min(i + quantityPerSet, cardList.size()); + final List oneGroupList = cardList.subList(i, upToWhatNumber); + groupOfCards.add(oneGroupList); } return groupOfCards; } diff --git a/dseki/paiza/src/CardShuffle.java b/dseki/paiza/src/CardShuffle.java index 0191968..a557fc8 100644 --- a/dseki/paiza/src/CardShuffle.java +++ b/dseki/paiza/src/CardShuffle.java @@ -28,8 +28,8 @@ public class CardShuffle { quantityPerSet, numberOfShuffles); final List cardAfterShuffle = cardShuffle.repeatShuffle(); - for (int i = 0; i < cardAfterShuffle.size(); i++) { - System.out.println(cardAfterShuffle.get(i)); + for (int card : cardAfterShuffle) { + System.out.println(card); } sc.close(); } -- GitLab