Java 策略最小-最大
Java Strategy Min-Max
学习Java 超技能。陷入战略主题。那里的社区没有反应,我不明白为什么我没有得到正确的结果。请帮忙。
我假设我没有理解这部分的实际含义:“如果数组为空,Finder 应该 return Integer.MAX_VALUE 以查找最小值,而 Integer.MIN_VALUE 以查找最小值最大值。
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
import java.util.ArrayList;
class Finder {
private FindingStrategy strategy;
public Finder(FindingStrategy strategy) {
this.strategy = strategy;
}
/**
* It performs the search algorithm according to the given strategy
*/
public int find(int[] numbers) {
return this.strategy.getResult(numbers);
}
}
interface FindingStrategy {
/**
* Returns search result
*/
int getResult(int[] numbers);
}
class MaxFindingStrategy implements FindingStrategy {
@Override
public int getResult(int[] numbers) {
if (numbers.length > 0 ){
Arrays.sort(numbers);
return numbers[0];
} else {
return Integer.MIN_VALUE;
}
}
}
class MinFindingStrategy implements FindingStrategy {
@Override
public int getResult(int[] numbers) {
if (numbers.length > 1 ){
Arrays.sort(numbers);
return numbers[numbers.length-1];
} else {
return Integer.MAX_VALUE;
}
}
}
/* Do not change code below */
public class Main {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
final String[] elements = scanner.nextLine().split("\s+");
int[] numbers = null;
if (elements[0].equals("EMPTY")) {
numbers = new int[0];
} else {
numbers = new int[elements.length];
for (int i = 0; i < elements.length; i++) {
numbers[i] = Integer.parseInt(elements[i]);
}
}
final String type = scanner.nextLine();
Finder finder = null;
switch (type) {
case "MIN":
finder = new Finder(new MinFindingStrategy());
break;
case "MAX":
finder = new Finder(new MaxFindingStrategy());
break;
default:
break;
}
if (finder == null) {
throw new RuntimeException(
"Unknown strategy type passed. Please, write to the author of the problem.");
}
System.out.println(finder.find(numbers));
}
}
想法是,当没有可用输入时,您需要 return Integer.MAX_VALUE
或 Integer.MIN_VALUE
。如果请求是从输入中找到最小值但输入为空,则 return Integer.MAX_VALUE
或者如果输入为空并且请求最大值,则 return Integer.MIN_VALUE
.
你的具体问题是因为这个;
if (numbers.length > 1 ){
您需要检查长度是否 > 0,而不是 1。
我会为这项工作使用流:
Arrays.stream(numbers).min().orElse(Integer.MIN_VALUE);
Arrays.stream(numbers).max().orElse(Integer.MAX_VALUE);
因为有了这个流,你不必检查 numbers.length
它也解决了你检查 numbers.length > 1
而不是 numbers.length > 0
的问题。
学习Java 超技能。陷入战略主题。那里的社区没有反应,我不明白为什么我没有得到正确的结果。请帮忙。 我假设我没有理解这部分的实际含义:“如果数组为空,Finder 应该 return Integer.MAX_VALUE 以查找最小值,而 Integer.MIN_VALUE 以查找最小值最大值。
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
import java.util.ArrayList;
class Finder {
private FindingStrategy strategy;
public Finder(FindingStrategy strategy) {
this.strategy = strategy;
}
/**
* It performs the search algorithm according to the given strategy
*/
public int find(int[] numbers) {
return this.strategy.getResult(numbers);
}
}
interface FindingStrategy {
/**
* Returns search result
*/
int getResult(int[] numbers);
}
class MaxFindingStrategy implements FindingStrategy {
@Override
public int getResult(int[] numbers) {
if (numbers.length > 0 ){
Arrays.sort(numbers);
return numbers[0];
} else {
return Integer.MIN_VALUE;
}
}
}
class MinFindingStrategy implements FindingStrategy {
@Override
public int getResult(int[] numbers) {
if (numbers.length > 1 ){
Arrays.sort(numbers);
return numbers[numbers.length-1];
} else {
return Integer.MAX_VALUE;
}
}
}
/* Do not change code below */
public class Main {
public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
final String[] elements = scanner.nextLine().split("\s+");
int[] numbers = null;
if (elements[0].equals("EMPTY")) {
numbers = new int[0];
} else {
numbers = new int[elements.length];
for (int i = 0; i < elements.length; i++) {
numbers[i] = Integer.parseInt(elements[i]);
}
}
final String type = scanner.nextLine();
Finder finder = null;
switch (type) {
case "MIN":
finder = new Finder(new MinFindingStrategy());
break;
case "MAX":
finder = new Finder(new MaxFindingStrategy());
break;
default:
break;
}
if (finder == null) {
throw new RuntimeException(
"Unknown strategy type passed. Please, write to the author of the problem.");
}
System.out.println(finder.find(numbers));
}
}
想法是,当没有可用输入时,您需要 return Integer.MAX_VALUE
或 Integer.MIN_VALUE
。如果请求是从输入中找到最小值但输入为空,则 return Integer.MAX_VALUE
或者如果输入为空并且请求最大值,则 return Integer.MIN_VALUE
.
你的具体问题是因为这个;
if (numbers.length > 1 ){
您需要检查长度是否 > 0,而不是 1。
我会为这项工作使用流:
Arrays.stream(numbers).min().orElse(Integer.MIN_VALUE);
Arrays.stream(numbers).max().orElse(Integer.MAX_VALUE);
因为有了这个流,你不必检查 numbers.length
它也解决了你检查 numbers.length > 1
而不是 numbers.length > 0
的问题。