java - 如何检查其他方法中的语句
问题描述
我正在使用 while 循环来检查输入,然后重复直到满足相关条件(注释掉的代码)。但是由于我有很多输入,我决定为此制定一个方法,并且它工作得很好(没有注释代码)。问题是当我想输入 acurrentnumber
时,它不应该大于boughtNumber
. 旧方法适用于此,但现在我无法将该语句传递给该inputCheck
方法。我怎样才能做到这一点,或者用另一种更好的方法代替它。不确定java是否支持“断言”,我可以在这里使用它。
我的方法
public void save() throws IOException{
String name = "";
String boughtNumber = "", currentNumber = "";
String buyPrice = "", sellPrice = "";
name = Functions.inputCheck("Unesite naziv artikla:\t\t", "string", true, false);
boughtNumber = Functions.inputCheck("Unesite nabavnu kolicinu:\t", "int", true, false);
currentNumber = Functions.inputCheck("Unesite trenutnu kolicinu:\t", "int", true, Integer.parseInt(currentNumber) > Integer.parseInt(boughtNumber));
buyPrice = Functions.inputCheck("Unesite nabavnu cijenu:\t\t", "float", true, false);
sellPrice = Functions.inputCheck("Unesite prodajnu cijenu:\t", "float", true, false);
// while(name == null || patternString.matcher(name).matches()==false) {
// System.out.print("Unesite naziv artikla:\t\t");
// name = input.nextLine();
// }
// while(boughtNumber == null || patternInt.matcher(boughtNumber).matches()==false) {
// System.out.print("Unesite nabavnu kolicinu:\t");
// boughtNumber = input.nextLine();
// }
//
// while(currentNumber == null || patternInt.matcher(currentNumber).matches()==false || Integer.parseInt(currentNumber) > Integer.parseInt(boughtNumber)) {
// System.out.print("Unesite trenutnu kolicinu:\t");
// currentNumber = input.nextLine();
// }
//
// while(buyPrice == null || patternFloat.matcher(buyPrice).matches()==false) {
// System.out.print("Unesite nabavnu cijenu:\t\t");
// buyPrice = input.nextLine();
// }
//
// while(sellPrice == null || patternFloat.matcher(sellPrice).matches()==false) {
// System.out.print("Unesite prodajnu cijenu:\t");
// sellPrice = input.nextLine();
// }
带有 inputCheck 方法的类
package hr.atos.praksa.josipmaricevic.zadatak15;
import java.util.Scanner;
import java.util.regex.Pattern;
public class Functions {
static Scanner input = new Scanner(System.in);
final static private Pattern patternNotBlank = Pattern.compile("\\S+");
final static private Pattern patternOIB = Pattern.compile("^[0-9]{11}$");
final static private Pattern patternString = Pattern.compile("[A-Z][a-z]*");
final static private Pattern patternInt = Pattern.compile("[0-9]+$");
final static private Pattern patternFloat = Pattern.compile("^[0-9]+([.]?[0-9]+|[0-9]*)");
public static String inputCheck(String print, String _pattern, boolean andStatement, boolean orStatement ) {
String string = "";
Pattern pattern = patternFloat;
switch(_pattern) {
case "int":
pattern = patternInt;
break;
case "float":
pattern = patternFloat;
break;
case "string":
pattern = patternString;
break;
case "oib":
pattern = patternOIB;
break;
case "notblank":
pattern = patternNotBlank;
break;
}
while((andStatement && pattern.matcher(string).matches()==false) || orStatement){
System.out.print(print);
string = input.nextLine();
}
return string;
}
}
如果有什么不清楚的地方,我可以澄清一下。
解决方案
您可能想为此研究谓词。
谓词是指定某个输入是否正常的函数,并且可以链接
例如:
final static private Pattern patternInt = Pattern.compile("[0-9]+$");
static Predicate isNumber = input -> patternInt.matcher((String)input).matches();
public static void main(String[] args) {
System.out.println();
Predicate numberOver50 = isNumber.and(input -> Integer.parseInt((String)input)>50);
test(numberOver50,"50");
test(numberOver50,"51");
}
static void test(Predicate test,String input){
System.out.println(test.test(input));
}
重写此 Functions 类将产生以下更改:
static Scanner input = new Scanner(System.in);
final static private Predicate<String> patternNotBlank = input -> Pattern.compile("\\S+").matcher(input).matches();
final static private Predicate<String> patternOIB = input -> Pattern.compile("^[0-9]{11}$").matcher( input).matches();
final static private Predicate<String> patternInt = input -> Pattern.compile("[0-9]+$").matcher( input).matches();
final static private Predicate<String> patternString = input -> Pattern.compile("[A-Z][a-z]*").matcher(input).matches();
final static private Predicate<String> patternFloat = input -> Pattern.compile("^[0-9]+([.]?[0-9]+|[0-9]*)").matcher(input).matches();
public static String inputCheck(String print, String _pattern, Predicate andStatement, Predicate orStatement ) {
Predicate<String> typeTest = patternFloat;
if (andStatement==null){
andStatement = input -> true;// a passthrough, always true
}
if (orStatement==null){
orStatement = input -> false;// a passthrough, always true
}
switch(_pattern) {
case "int":
typeTest = patternInt;
break;
case "float":
typeTest = patternFloat;
break;
case "string":
typeTest = patternString;
break;
case "oib":
typeTest = patternOIB;
break;
case "notblank":
typeTest = patternNotBlank;
break;
}
String string;
do {
System.out.print(print);
string = input.nextLine();
} while (andStatement.and(typeTest.negate()).or(orStatement).test(string));
return string;
}
现在您可以在声明函数时添加额外的测试:
Predicate NOEND = input -> true;
Preducate NOOR = input -> false;
...
currentNumber = Functions.inputCheck("Unesite trenutnu kolicinu:\t", "int",NOEND, input->{return Integer.parseInt((String)input)> Integer.parseInt(boughtNumber)};
请注意,函数中使用的变量必须是“final”(有效的 final,它并不总是与预定义为 final 的类型相同!)
另外函数会在你写的时候定义好,所以当时需要填写buyNumber,如果你把ordering改为先获取currentNumber再buyNumber的话,由于还没有填写buyNumber,所以不生效。 't 有效 final (将在后面的方法中更改!)
编辑:通过定义不需要额外转换的谓词类。(更改了示例代码以显示这一点。)
推荐阅读
- python - 表现 BDD 测试 - 在测试结束时结束线程/节点
- css - 我的过渡延迟和持续时间不起作用
- python - 为什么这个表格不会改变网站的语言?
- python - 在一行 if-else 语句中赋值给变量
- node.js - Nodegit'找不到配置值'虽然存在
- javascript - 根据其他值重命名 yup 错误键
- spring - Spring找不到bean
- android - Android API“31”和Android API“S”有什么区别?
- python - Python Pandas 对数据点之间的平均值进行上采样(15 分钟到 1 分钟)
- python-3.x - 用单个字符替换字符串中的所有字母