你好 StackoverFlow 社區
我正在開發一個 DieToss 程式,該程式旨在在給定輸入長度的情況下列印隨機序列號,并且隨機折騰需要在 1 到 6 之間。目標是將括號放在最長或第一個重復字串周圍。
這里的問題是它繼續在所有重復的整數字串周圍加上括號,我的努力沒有成功。
下面是在給定整數陣列中查找重復項的程式。
public class DieToss {
public static void main(String[] args) {
boolean restartQ = true;
while(restartQ){
int numDie = 0;
Scanner in = new Scanner(System.in);
boolean ehandle = true;
System.out.println("Tell me how many dice you want me to throw?");
System.out.println("Be sure that it is 10 or greater but only up to 30");
while (ehandle) {
try {
numDie = in.nextInt();
if(numDie <= 30 && numDie >= 10){
ehandle = false;
}
else{
System.out.println("Please Re-enter. It needs to be greater than or equal to 10 but only up to 30.");
System.out.println("Tell me how many dice you want me to throw?");
continue;
}
}
catch (Exception e) {
System.out.println("Please enter integers only");
System.out.println("Tell me how many dice you want me to throw?");
System.out.println("Be sure that it is 10 or greater but only up to 30");
in.next();
}
}
int[] dieToss = new int[numDie];
Random random = new Random();
for (int i = 0; i < dieToss.length; i ) {
dieToss[i] = 1 random.nextInt(6);
}
//String dieArr = (Arrays.toString(dieToss));
//System.out.print(Arrays.toString(dieToss));
boolean parenOpen = false;
for (int i = 0; i < dieToss.length; i ){
if (i < dieToss.length - 1)
{
if (dieToss[i] == dieToss[i 1] && !parenOpen )
{
System.out.print("(");
parenOpen = true;
}
System.out.print(dieToss[i] " ");
if (dieToss[i] != dieToss[i 1] && parenOpen)
{
System.out.print(")");
parenOpen = false;
}
}
}
System.out.println(dieToss[dieToss.length - 1]);
System.out.println(" ");
System.out.println("Any duplicates that I have found are displayed above in parentheses.");
if (parenOpen)
{
System.out.print(")");
}
System.out.println("Would you like to reroll? Maybe test your luck?");
System.out.println(" ");
System.out.println("Enter any key if you would like to. Press n to exit.");
Scanner in2 = new Scanner(System.in);
String reRoll = in2.nextLine();
if(reRoll.equals("n") || reRoll.equals("N")){
restartQ = false;
}
else{
continue;
}
}
}
}
如何修改此代碼塊以將自身限制為最長的重復字串?
任何幫助是極大的贊賞。
uj5u.com熱心網友回復:
介紹
我修改了您的代碼并運行了 63 次測驗。這是第63次測驗的結果。
How many dice do you want me to throw?
Type a number between 10 and 30
15
The 15 die rolls are: [2, 3, 4, 4, 6, 6, 5, 4, 6, 3, 3, 5, 4, 1, 4]
The first, longest duplicate run is: [2, 3, (4, 4), 6, 6, 5, 4, 6, 3, 3, 5, 4, 1, 4]
Would you like to reroll (y or n)?
y
How many dice do you want me to throw?
Type a number between 10 and 30
15
The 15 die rolls are: [3, 1, 6, 4, 3, 5, 4, 6, 1, 1, 1, 5, 2, 6, 5]
The first, longest duplicate run is: [3, 1, 6, 4, 3, 5, 4, 6, (1, 1, 1), 5, 2, 6, 5]
Would you like to reroll (y or n)?
y
How many dice do you want me to throw?
Type a number between 10 and 30
15
The 15 die rolls are: [1, 2, 5, 1, 2, 6, 4, 1, 4, 4, 6, 4, 5, 1, 1]
The first, longest duplicate run is: [1, 2, 5, 1, 2, 6, 4, 1, (4, 4), 6, 4, 5, 1, 1]
Would you like to reroll (y or n)?
n
解釋
我做的第一件事是將你的單體代碼分解成方法,我最終創建了九個方法,不包括main方法。通過將代碼拆分為方法,我能夠單獨測驗每個小部分。正如我所說,在對代碼感到滿意之前,我進行了 63 次測驗。
Java 方法名稱是動詞-名詞組合。
該findLargestDuplicates方法需要一些解釋。該方法回傳一對索引,一個開始索引和一個結束索引。如果沒有重復的骰子擲骰,則該方法回傳結束索引為零。
該findLargestDuplicates方法找到每次重復擲骰子的開始索引。僅保留并回傳最大的重復擲骰子。因為從第一個索引到最后一個索引檢查擲骰子陣列,所以回傳第一個最長的重復擲骰子運行。
我回傳了一個int包含兩個索引值的陣列,因為 Java 方法回傳一個值。
代碼
這是完整的可運行代碼。
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class DieToss {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
new DieToss().performDieToss(scanner);
scanner.close();
}
public void performDieToss(Scanner scanner) {
Random random = new Random();
do {
int numberOfTosses = getNumberOfTosses(scanner);
int[] dieToss = createRandomArray(random, numberOfTosses);
int[] indexes = findLargestDuplicates(dieToss);
String prefix = "The " numberOfTosses " die rolls are: ";
System.out.println(generateOutput(prefix, dieToss));
if (indexes[1] == 0) {
System.out.println("There were no duplicate dice rolls");
} else {
prefix = "The first, longest duplicate run is: ";
System.out.println(generateOutput(prefix, dieToss, indexes));
}
} while (continueRolling(scanner));
}
private int getNumberOfTosses(Scanner scanner) {
int numberOfTosses = 0;
int minimum = 10;
int maximum = 30;
String text = "Type a number between " minimum " and " maximum;
System.out.println("How many dice do you want me to throw?");
System.out.println(text);
do {
numberOfTosses = valueOf(scanner.nextLine().trim());
if (!isNumberInRange(numberOfTosses, minimum, maximum)) {
System.out.println(text);
}
} while (!isNumberInRange(numberOfTosses, minimum, maximum));
return numberOfTosses;
}
private boolean isNumberInRange(int number, int minimum, int maximum) {
return number >= minimum && number <= maximum;
}
private int valueOf(String line) {
try {
return Integer.valueOf(line);
} catch (NumberFormatException e) {
return 0;
}
}
private int[] createRandomArray(Random random, int numberOfTosses) {
int[] dieToss = new int[numberOfTosses];
for (int i = 0; i < dieToss.length; i ) {
dieToss[i] = 1 random.nextInt(6);
}
return dieToss;
}
private int[] findLargestDuplicates(int[] dieToss) {
int startIndex = 0;
int duplicateValue = 0;
int duplicateCount = 0;
int maximumStartIndex = 0;
int maximumEndIndex = 0;
int maximumDuplicateCount = 0;
for (int index = 0; index < dieToss.length; index ) {
if (dieToss[index] == duplicateValue) {
duplicateCount ;
if (index >= (dieToss.length - 1)) {
if (duplicateCount > maximumDuplicateCount) {
maximumStartIndex = startIndex;
maximumEndIndex = index;
maximumDuplicateCount = duplicateCount;
}
}
} else {
if (index < (dieToss.length - 1)) {
if (duplicateCount > maximumDuplicateCount) {
maximumStartIndex = startIndex;
maximumEndIndex = index - 1;
maximumDuplicateCount = duplicateCount;
}
} else {
if (duplicateCount > maximumDuplicateCount) {
maximumStartIndex = startIndex;
maximumEndIndex = index;
maximumDuplicateCount = duplicateCount;
}
if (maximumEndIndex < maximumStartIndex) {
maximumEndIndex = index;
}
}
startIndex = index;
duplicateValue = dieToss[index];
duplicateCount = 1;
}
}
int[] indexes = { maximumStartIndex, maximumEndIndex };
return indexes;
}
private String generateOutput(String prefix, int[] dieToss) {
return prefix Arrays.toString(dieToss);
}
private String generateOutput(String prefix, int[] dieToss, int[] indexes) {
String output = prefix "[";
for (int index = 0; index < dieToss.length; index ) {
if (indexes[0] == index) {
output = "(";
}
output = dieToss[index];
if (indexes[1] == index) {
output = ")";
}
if (index < (dieToss.length - 1)) {
output = ", ";
}
}
output = "]";
return output;
}
private boolean continueRolling(Scanner scanner) {
System.out.println("Would you like to reroll (y or n)?");
String line = scanner.nextLine().trim();
if (line.length() > 0) {
char c = Character.toLowerCase(line.charAt(0));
return c == 'y';
} else {
return false;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/443239.html
上一篇:在日期間隔內計算日期
