[Change] refactor code

This commit is contained in:
2023-09-18 22:11:16 +07:00
parent e3f89245f6
commit 1ccb626c24
27 changed files with 235 additions and 311 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dev.miti99</groupId>
<groupId>com.github.tiennm99</groupId>
<artifactId>lottery-generator</artifactId>
<version>1.0-SNAPSHOT</version>
@@ -0,0 +1,35 @@
package com.github.tiennm99.lotterygenerator;
import java.util.HashMap;
import java.util.Set;
public class GenerateUntilMatchPreviousCaseNTimesLotteryGenerator extends NormalLotteryGenerator {
public static final int DEFAULT_MATCH_TIME = 3;
private final int matchTime;
public GenerateUntilMatchPreviousCaseNTimesLotteryGenerator(int matchTime) {
this.matchTime = matchTime;
}
public GenerateUntilMatchPreviousCaseNTimesLotteryGenerator() {
this(DEFAULT_MATCH_TIME);
}
@Override
public Set<Integer> generateNumbers(int totalNumber, int numNumber) {
var history = new HashMap<Set<Integer>, Integer>();
Set<Integer> numbers;
int count = 0;
while (true) {
numbers = super.generateNumbers(totalNumber, numNumber);
var times = history.merge(numbers, 1, Integer::sum);
System.out.printf("%d. %s %d\n", count, numbers, times);
if (times == matchTime) {
break;
}
count++;
}
return numbers;
}
}
@@ -0,0 +1,8 @@
package com.github.tiennm99.lotterygenerator;
import java.util.Set;
public interface LotteryGenerator {
Set<Integer> generateNumbers(int totalNumber, int numNumber);
}
@@ -0,0 +1,10 @@
package com.github.tiennm99.lotterygenerator;
public class Main {
public static void main(String[] args) {
var generator = new NormalLotteryGenerator();
var result = generator.generateNumbers(45, 6);
System.out.println(result);
}
}
@@ -0,0 +1,27 @@
package com.github.tiennm99.lotterygenerator;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class NormalLotteryGenerator implements LotteryGenerator {
protected Set<Integer> generateBaseNumbers(int totalNumber) {
return IntStream.rangeClosed(1, totalNumber).boxed().collect(Collectors.toSet());
}
@Override
public Set<Integer> generateNumbers(int totalNumber, int numNumber) {
var baseNumbers = generateBaseNumbers(totalNumber);
var result = new TreeSet<Integer>();
for (int i = 0; i < numNumber; i++) {
var index = ThreadLocalRandom.current().nextInt(baseNumbers.size());
var number = baseNumbers.stream().skip(index).findFirst().orElseThrow();
result.add(number);
baseNumbers.remove(number);
}
return result;
}
}
@@ -0,0 +1,14 @@
package com.github.tiennm99.lotterygenerator;
import java.util.Set;
public class ReversedNormalLotteryGenerator extends NormalLotteryGenerator {
@Override
public Set<Integer> generateNumbers(int totalNumber, int numNumber) {
var baseNumbers = generateBaseNumbers(totalNumber);
var removedNumbers = super.generateNumbers(totalNumber, totalNumber - numNumber);
baseNumbers.removeAll(removedNumbers);
return baseNumbers;
}
}
@@ -1,6 +1,5 @@
package dev.miti99.lotterygenerator.mega;
package com.github.tiennm99.lotterygenerator;
import dev.miti99.lotterygenerator.LotteryGenerator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -9,15 +8,26 @@ import java.util.TreeMap;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
public class TopMatchedNumberGenerator implements LotteryGenerator {
public class TopMatchedLotteryGenerator implements LotteryGenerator {
public static final int DEFAULT_MATCH_TIME = 1_000_000;
private final int matchTime;
public TopMatchedLotteryGenerator(int matchTime) {
this.matchTime = matchTime;
}
public TopMatchedLotteryGenerator() {
this(DEFAULT_MATCH_TIME);
}
@Override
public Set<Integer> generateNumbers(int numNumber) {
public Set<Integer> generateNumbers(int totalNumber, int numNumber) {
Map<Integer, Integer> matchedNumbers = new HashMap<>();
while (true) {
var number = ThreadLocalRandom.current().nextInt(1, 56);
var number = ThreadLocalRandom.current().nextInt(1, totalNumber + 1);
matchedNumbers.merge(number, 1, Integer::sum);
if (matchedNumbers.get(number) == 1_000_000_000) {
if (matchedNumbers.get(number) == matchTime) {
break;
}
}
@@ -1,8 +0,0 @@
package dev.miti99.lotterygenerator;
import java.util.Set;
public interface LotteryGenerator {
Set<Integer> generateNumbers(int numNumber);
}
@@ -1,12 +0,0 @@
package dev.miti99.lotterygenerator;
import dev.miti99.lotterygenerator.mega.Mega655Generator;
public class Main {
public static void main(String[] args) {
var generator = new Mega655Generator();
var result = generator.generateNumbers(7);
System.out.println(result);
}
}
@@ -1,17 +0,0 @@
package dev.miti99.lotterygenerator.mega;
import java.util.Set;
public class BasePresetGenerator extends MegaGenerator {
int numNumber;
public BasePresetGenerator(int minNumber, int maxNumber, int numNumber) {
super(minNumber, maxNumber);
this.numNumber = numNumber;
}
public Set<Integer> generateNumbers() {
return generateNumbers(numNumber);
}
}
@@ -1,33 +0,0 @@
package dev.miti99.lotterygenerator.mega;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Mega645GenerateUntilMatchPreviousCaseNTimes {
private final Map<Set<Integer>, Integer> history = new HashMap<>();
public static void main(String[] args) {
var generator = new Mega645GenerateUntilMatchPreviousCaseNTimes();
var result = generator.generate();
System.out.println(result);
}
public Set<Integer> generate() {
history.clear();
var generator = new Mega645Generator();
Set<Integer> numbers;
int count = 0;
while (true) {
numbers = generator.generateNumbers(6);
var times = history.merge(numbers, 1, Integer::sum);
System.out.printf("%d. %s %d\n", count, numbers, times);
if (times == 3) {
break;
}
count++;
}
return numbers;
}
}
@@ -1,12 +0,0 @@
package dev.miti99.lotterygenerator.mega;
public class Mega645Generator extends BasePresetGenerator {
public Mega645Generator(int numNumber) {
super(1, 45, numNumber);
}
public Mega645Generator() {
this(6);
}
}
@@ -1,30 +0,0 @@
package dev.miti99.lotterygenerator.mega;
import java.util.HashSet;
import java.util.Set;
public class Mega655GenerateUntilMatchPreviousCase {
private final Set<Set<Integer>> history = new HashSet<>();
public static void main(String[] args) {
var generator = new Mega655GenerateUntilMatchPreviousCase();
var result = generator.generate();
System.out.println(result);
}
public Set<Integer> generate() {
history.clear();
var generator = new Mega655Generator();
Set<Integer> numbers;
while (true) {
numbers = generator.generateNumbers(6);
System.out.printf("%d. %s\n", history.size(), numbers);
if (history.contains(numbers)) {
break;
}
history.add(numbers);
}
return numbers;
}
}
@@ -1,12 +0,0 @@
package dev.miti99.lotterygenerator.mega;
public class Mega655Generator extends BasePresetGenerator {
public Mega655Generator(int numNumber) {
super(1, 55, numNumber);
}
public Mega655Generator() {
this(6);
}
}
@@ -1,43 +0,0 @@
package dev.miti99.lotterygenerator.mega;
import dev.miti99.lotterygenerator.LotteryGenerator;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class MegaGenerator implements LotteryGenerator {
int minNumber;
int maxNumber;
public MegaGenerator(int minNumber, int maxNumber) {
this.minNumber = minNumber;
this.maxNumber = maxNumber;
}
protected int getTotalNumber() {
return maxNumber - minNumber + 1;
}
protected List<Integer> generateBaseNumbers() {
return IntStream.rangeClosed(minNumber, maxNumber).boxed().collect(Collectors.toList());
}
@Override
public Set<Integer> generateNumbers(int numNumber) {
var baseNumbers = generateBaseNumbers();
var result = new TreeSet<Integer>();
for (int i = 0; i < numNumber; i++) {
var index = ThreadLocalRandom.current().nextInt(baseNumbers.size());
result.add(baseNumbers.get(index));
baseNumbers.remove(index);
}
return result;
}
}
@@ -1,12 +0,0 @@
package dev.miti99.lotterygenerator.mega.reverserd;
public class ReversedMega645Generator extends ReversedMegaGenerator {
public ReversedMega645Generator(int numNumber) {
super(1, 45, numNumber);
}
public ReversedMega645Generator() {
this(6);
}
}
@@ -1,12 +0,0 @@
package dev.miti99.lotterygenerator.mega.reverserd;
public class ReversedMega655Generator extends ReversedMegaGenerator {
public ReversedMega655Generator(int numNumber) {
super(1, 55, numNumber);
}
public ReversedMega655Generator() {
this(6);
}
}
@@ -1,21 +0,0 @@
package dev.miti99.lotterygenerator.mega.reverserd;
import dev.miti99.lotterygenerator.mega.BasePresetGenerator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class ReversedMegaGenerator extends BasePresetGenerator {
public ReversedMegaGenerator(int minNumber, int maxNumber, int numNumber) {
super(minNumber, maxNumber, numNumber);
}
@Override
public Set<Integer> generateNumbers(int numNumber) {
var baseNumbers = generateBaseNumbers();
var removedNumbers = super.generateNumbers(getTotalNumber() - numNumber);
return baseNumbers.stream().filter(n -> !removedNumbers.contains(n))
.collect(Collectors.toSet());
}
}
@@ -0,0 +1,31 @@
package com.github.tiennm99.lotterygenerator;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class GenerateUntilMatchPreviousCaseNTimesLotteryGeneratorTest {
@Test
void testMega645() {
var generator = new GenerateUntilMatchPreviousCaseNTimesLotteryGenerator();
var numbers = generator.generateNumbers(45, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 45);
}
}
@Test
void testMega655() {
var generator = new GenerateUntilMatchPreviousCaseNTimesLotteryGenerator();
var numbers = generator.generateNumbers(55, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 55);
}
}
}
@@ -0,0 +1,31 @@
package com.github.tiennm99.lotterygenerator;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class NormalLotteryGeneratorTest {
@Test
void testMega645() {
var generator = new NormalLotteryGenerator();
var numbers = generator.generateNumbers(45, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 45);
}
}
@Test
void testMega655() {
var generator = new NormalLotteryGenerator();
var numbers = generator.generateNumbers(55, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 55);
}
}
}
@@ -0,0 +1,31 @@
package com.github.tiennm99.lotterygenerator;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class ReversedNormalLotteryGeneratorTest {
@Test
void testMega645() {
var generator = new ReversedNormalLotteryGenerator();
var numbers = generator.generateNumbers(45, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 45);
}
}
@Test
void testMega655() {
var generator = new ReversedNormalLotteryGenerator();
var numbers = generator.generateNumbers(55, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 55);
}
}
}
@@ -0,0 +1,31 @@
package com.github.tiennm99.lotterygenerator;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class TopMatchedLotteryGeneratorTest {
@Test
void testMega645() {
var generator = new TopMatchedLotteryGenerator();
var numbers = generator.generateNumbers(45, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 45);
}
}
@Test
void testMega655() {
var generator = new TopMatchedLotteryGenerator();
var numbers = generator.generateNumbers(55, 6);
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 55);
}
}
}
@@ -1,19 +0,0 @@
package dev.miti99.lotterygenerator.mega;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class Mega645GeneratorTest {
@Test
public void testGenerateNumbers() {
var mega645Generator = new Mega645Generator();
var numbers = mega645Generator.generateNumbers();
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 45);
}
}
}
@@ -1,19 +0,0 @@
package dev.miti99.lotterygenerator.mega;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class Mega655GeneratorTest {
@Test
public void testGenerateNumbers() {
var mega645Generator = new Mega645Generator();
var numbers = mega645Generator.generateNumbers();
System.out.println(numbers);
assertEquals(6, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 55);
}
}
}
@@ -1,14 +0,0 @@
package dev.miti99.lotterygenerator.mega;
import org.junit.jupiter.api.Test;
class TopMatchedNumberGeneratorTest {
@Test
void generateNumbers() {
var generator = new TopMatchedNumberGenerator();
var numbers = generator.generateNumbers(7);
System.out.println(numbers);
}
}
@@ -1,20 +0,0 @@
package dev.miti99.lotterygenerator.mega.reverserd;
import dev.miti99.lotterygenerator.mega.Mega645Generator;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ReversedMega645GeneratorTest {
@Test
public void testGenerateNumbers() {
var mega645Generator = new Mega645Generator();
var numbers = mega645Generator.generateNumbers(7);
System.out.println(numbers);
assertEquals(7, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 45);
}
}
}
@@ -1,20 +0,0 @@
package dev.miti99.lotterygenerator.mega.reverserd;
import dev.miti99.lotterygenerator.mega.Mega645Generator;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ReversedMega655GeneratorTest {
@Test
public void testGenerateNumbers() {
var mega645Generator = new Mega645Generator();
var numbers = mega645Generator.generateNumbers(7);
System.out.println(numbers);
assertEquals(7, numbers.size());
for (int number : numbers) {
assertTrue(number >= 1 && number <= 55);
}
}
}