Java 代码效率。使用循环的有效方法
我正在为web应用程序构建一个框架,并希望执行一些简单的任务,如输入检索和显示。下面是我的代码,我觉得代码可以改进,效率不高。注意:这三种方法都有相同的实现 开关需要实现两次,一次在IF循环中,另一次在一般情况下Java 代码效率。使用循环的有效方法,java,loops,if-statement,switch-statement,performance,Java,Loops,If Statement,Switch Statement,Performance,我正在为web应用程序构建一个框架,并希望执行一些简单的任务,如输入检索和显示。下面是我的代码,我觉得代码可以改进,效率不高。注意:这三种方法都有相同的实现 开关需要实现两次,一次在IF循环中,另一次在一般情况下 public class selector8 { public static void main (String [] args){ selector8 obj1 = new selector8(); Scanner inputString = n
public class selector8
{
public static void main (String [] args){
selector8 obj1 = new selector8();
Scanner inputString = new Scanner (System.in);
Scanner inputYN = new Scanner (System.in);
String input, A,B,C;
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
char contLoop1 = 'y';
do{
if(input.equalsIgnoreCase("y")) {
input = "";
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
switch (input){
case("a"):
obj1.startMethod1(input);
break;
case("b"):
obj1.startMethod2(input);
break;
case("c"):
obj1.startMethod3(input);
break;
case("x"):
System.out.println("Goodbye");
break;
case ("n"):
System.out.println("See ya");
break;
default:
System.out.println("Invalid argument. Try again");
break;
}
} else
switch (input){
case("a"):
obj1.startMethod1(input);
break;
case("b"):
obj1.startMethod2(input);
break;
case("c"):
obj1.startMethod3(input);
break;
case("x"):
System.out.println("Goodbye");
break;
case ("n"):
System.out.println("See ya");
break;
default:
System.out.println("Invalid argument. Try again");
break;
}
System.out.println("Do want to try again " +"Y/N" );
input = inputYN.nextLine();
contLoop1 = input.charAt(0);
}while(contLoop1 != 'n');
}
public void startMethod1(String A){
String input;
Scanner inputString = new Scanner (System.in);
System.out.println("Enter a or b");
input = inputString.nextLine();
switch (input){
case("a"):
System.out.println("output parsed");
break;
case("b"):
System.out.println("output parsed");
break;
default:
System.out.println("Invalid argument");
}
}
public void startMethod2(String B){
String input;
Scanner inputString = new Scanner (System.in);
System.out.println("Enter a or b");
input = inputString.nextLine();
switch (input){
case("a"):
System.out.println("output parsed");
break;
case("b"):
System.out.println("output parsed");
break;
default:
System.out.println("Invalid argument");
break;
}
}
public void startMethod3(String C){
String input;
Scanner inputString = new Scanner (System.in);
System.out.println("Enter a or b");
input = inputString.nextLine();
switch (input){
case("a"):
System.out.println("output parsed");
break;
case("b"):
System.out.println("output parsed");
break;
default:
System.out.println("Invalid argument");
}
}
}
另一方面,你能告诉我为什么在没有对象的情况下可以调用静态类吗
public class StaticImplementation{
public static void main (String [] args){
StaticImplementation obj1 = new StaticImplementation();
obj1.stat(); //is invalid
stat(); //is valid
}
static void stat(){
System.out.println("Static class");
}
非常感谢。祝你有愉快的一天 哦,是的,它可以。您不需要两个扫描仪,我会将您的开关提取到一个方法(我们称之为
startMethods
)中,如下所示-
private static void startMethods(selector8 obj1,
String input) {
switch (input) {
case ("a"):
obj1.startMethod1(input);
break;
case ("b"):
obj1.startMethod2(input);
break;
case ("c"):
obj1.startMethod3(input);
break;
case ("x"):
System.out.println("Goodbye");
break;
case ("n"):
System.out.println("See ya");
break;
default:
System.out.println("Invalid argument. Try again");
break;
}
}
public static void main(String[] args) {
selector8 obj1 = new selector8();
Scanner inputString = new Scanner(System.in);
String input, A, B, C;
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
char contLoop1 = 'y';
do {
if (input.equalsIgnoreCase("y")) {
input = "";
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
startMethods(obj1, input);
} else
startMethods(obj1, input);
System.out.println("Do want to try again "
+ "Y/N");
input = inputString.nextLine();
contLoop1 = input.charAt(0);
} while (contLoop1 != 'n');
}
哦,是的,它可以。您不需要两个扫描仪,我会将您的开关提取到一个方法(我们称之为
startMethods
)中,如下所示-
private static void startMethods(selector8 obj1,
String input) {
switch (input) {
case ("a"):
obj1.startMethod1(input);
break;
case ("b"):
obj1.startMethod2(input);
break;
case ("c"):
obj1.startMethod3(input);
break;
case ("x"):
System.out.println("Goodbye");
break;
case ("n"):
System.out.println("See ya");
break;
default:
System.out.println("Invalid argument. Try again");
break;
}
}
public static void main(String[] args) {
selector8 obj1 = new selector8();
Scanner inputString = new Scanner(System.in);
String input, A, B, C;
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
char contLoop1 = 'y';
do {
if (input.equalsIgnoreCase("y")) {
input = "";
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
startMethods(obj1, input);
} else
startMethods(obj1, input);
System.out.println("Do want to try again "
+ "Y/N");
input = inputString.nextLine();
contLoop1 = input.charAt(0);
} while (contLoop1 != 'n');
}
使用Java,您可能会采取更“面向对象”的方法,并将这些开关留给C编程:) 做一些类似于:
interface Action {
void start();
}
class Jumper implements Action {
public void start() {
System.out.println("Jump!");
}
}
class Sitter implements Action {
public void start() {
System.out.println("Sit!");
}
}
class Runner implements Action {
public void start() {
System.out.println("Run!");
}
}
class Test {
public static void main(String[] args) {
// init phase
Map<String, Action> map = new HashMap<String, Action>();
map.put("a", new Jumper());
map.put("b", new Runner());
// usage
map.get("a").start();
}
}
接口动作{
void start();
}
类跳线实现操作{
公开作废开始(){
System.out.println(“跳转!”);
}
}
类坐席执行动作{
公开作废开始(){
System.out.println(“Sit!”);
}
}
类运行程序实现操作{
公开作废开始(){
System.out.println(“Run!”);
}
}
课堂测试{
公共静态void main(字符串[]args){
//初始阶段
Map Map=newhashmap();
map.put(“a”,新跳线());
map.put(“b”,newrunner());
//用法
map.get(“a”).start();
}
}
您可以有两个映射,一个用于Y,另一个用于其余,您还可以有一个由两个字符串对组成的键,使用Java您可能会采取更“面向对象”的方法,并将这些开关留给C编程:) 做一些类似于:
interface Action {
void start();
}
class Jumper implements Action {
public void start() {
System.out.println("Jump!");
}
}
class Sitter implements Action {
public void start() {
System.out.println("Sit!");
}
}
class Runner implements Action {
public void start() {
System.out.println("Run!");
}
}
class Test {
public static void main(String[] args) {
// init phase
Map<String, Action> map = new HashMap<String, Action>();
map.put("a", new Jumper());
map.put("b", new Runner());
// usage
map.get("a").start();
}
}
接口动作{
void start();
}
类跳线实现操作{
公开作废开始(){
System.out.println(“跳转!”);
}
}
类坐席执行动作{
公开作废开始(){
System.out.println(“Sit!”);
}
}
类运行程序实现操作{
公开作废开始(){
System.out.println(“Run!”);
}
}
课堂测试{
公共静态void main(字符串[]args){
//初始阶段
Map Map=newhashmap();
map.put(“a”,新跳线());
map.put(“b”,newrunner());
//用法
map.get(“a”).start();
}
}
您可以有两个映射,一个用于Y,另一个用于其余,您还可以有一个由两个字符串对组成的键
public class Selector8 {
public static void main(String[] args) {
Selector8 obj1 = new Selector8();
Scanner inputString = new Scanner(System.in);
Scanner inputYN = new Scanner(System.in);
String input, A, B, C;
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
char contLoop1 = 'y';
while (contLoop1 != 'n') {
if (input.equalsIgnoreCase("y")) {
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
}
switch (input) {
case ("a"):
case ("b"):
case ("c"):
obj1.startMethod();
break;
default:
System.out.println(validate(input));
break;
}
System.out.println("Do want to try again " + "Y/N");
input = inputYN.nextLine();
contLoop1 = input.charAt(0);
}
}
public static String validate(String input) {
if (input.equalsIgnoreCase("x"))
return "Goodbye";
if (input.equalsIgnoreCase("n"))
return "See ya";
return "Invalid argument. Try again";
}
public void startMethod() {
Scanner inputString = new Scanner(System.in);
System.out.println("Enter a or b");
String input = inputString.nextLine();
switch (input) {
case ("a"):
case ("b"):
System.out.println("output parsed");
break;
default:
System.out.println("Invalid argument");
}
}
}
试试这个:
public class Selector8 {
public static void main(String[] args) {
Selector8 obj1 = new Selector8();
Scanner inputString = new Scanner(System.in);
Scanner inputYN = new Scanner(System.in);
String input, A, B, C;
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
char contLoop1 = 'y';
while (contLoop1 != 'n') {
if (input.equalsIgnoreCase("y")) {
System.out.println("Choose. A || B || C || X to exit");
input = inputString.nextLine();
}
switch (input) {
case ("a"):
case ("b"):
case ("c"):
obj1.startMethod();
break;
default:
System.out.println(validate(input));
break;
}
System.out.println("Do want to try again " + "Y/N");
input = inputYN.nextLine();
contLoop1 = input.charAt(0);
}
}
public static String validate(String input) {
if (input.equalsIgnoreCase("x"))
return "Goodbye";
if (input.equalsIgnoreCase("n"))
return "See ya";
return "Invalid argument. Try again";
}
public void startMethod() {
Scanner inputString = new Scanner(System.in);
System.out.println("Enter a or b");
String input = inputString.nextLine();
switch (input) {
case ("a"):
case ("b"):
System.out.println("output parsed");
break;
default:
System.out.println("Invalid argument");
}
}
}
你有一个回路。效率很高。不过,这可能需要一些整理(将东西转移到它们自己的方法、更好的命名约定等)。@Makoto:我觉得有两个执行相同功能的开关循环看起来很混乱。我想知道是否可以在不需要if(input.equalsIgnoreCase(“y”))的情况下执行第一个if循环函数。好吧,这很麻烦。这是肯定的。如果有两条语句(它们是switch语句,循环也是一条语句),那么将它们重构为一个方法。然后,看看是否需要第二个方法调用。@Makoto:谢谢你提供了一个有价值的输入。我将把开关循环重构成一个方法,并调用该方法。如果在两种不同的条件下执行相同的任务,则将该任务放入一个方法中(例如startMethodX()执行相同的任务),因此不需要使用不同的方法。2.如果两个开关箱需要执行相同的任务,则将这些开关箱合并。(这里是startMethodX()和main()中的案例)。3.startMethodX()中不需要新的扫描仪,我想您正在将值传递给它。因此,如果这是您需要处理的值,请使用该值。4.main()的if-else中完成的任务是相同的,所以不需要if-else。您有一个循环。效率很高。不过,这可能需要一些整理(将东西转移到它们自己的方法、更好的命名约定等)。@Makoto:我觉得有两个执行相同功能的开关循环看起来很混乱。我想知道是否可以在不需要if(input.equalsIgnoreCase(“y”))的情况下执行第一个if循环函数。好吧,这很麻烦。这是肯定的。如果有两条语句(它们是switch语句,循环也是一条语句),那么将它们重构为一个方法。然后,看看是否需要第二个方法调用。@Makoto:谢谢你提供了一个有价值的输入。我将把开关循环重构成一个方法,并调用该方法。如果在两种不同的条件下执行相同的任务,则将该任务放入一个方法中(例如startMethodX()执行相同的任务),因此不需要使用不同的方法。2.如果两个开关箱需要执行相同的任务,则将这些开关箱合并。(这里是startMethodX()和main()中的案例)。3.startMethodX()中不需要新的扫描仪,我想您正在将值传递给它。因此,如果这是您需要处理的值,请使用该值。4.main()的if-else中完成的任务相同,因此不需要if-else。