簡體   English   中英

涉及字符串比較的Java程序優化

[英]Java Program Optimization Involving String Comparison

因此,我制作了一個簡單的程序,該程序測試兩個字符串值(代表兩種單獨的原色)的區別和類型,以確定所得混合物的顏色。

/**
 * A program that prompts the user to enter the names of two different primary colors to create a mixture.
 * 
 * @author A. Mackey
 * @version 1.0
 */
import java.util.*;
public class ColourMixer {
    public static void main(String [] args) {
        colourMixer();
    }

    public static void colourMixer() {
        Scanner in = new Scanner(System.in);
        String colourOne = "";
        String colourTwo = "";

        System.out.println("You are mixing two different primary colours.");

        System.out.print("Enter your first colour: ");
        colourOne = in.nextLine();

        System.out.print("Enter your second colour: ");
        colourTwo = in.nextLine();

        if((colourOne.equalsIgnoreCase("red") || colourOne.equalsIgnoreCase("blue") ) && (colourTwo.equalsIgnoreCase("blue") || colourTwo.equalsIgnoreCase("red") && !(colourOne.equalsIgnoreCase(colourTwo)))) {
            System.out.println("Your colour combination creates purple!");
        } else if ((colourOne.equalsIgnoreCase("red") || colourOne.equalsIgnoreCase("yellow") ) && (colourTwo.equalsIgnoreCase("yellow") || colourTwo.equalsIgnoreCase("red") && !(colourOne.equalsIgnoreCase(colourTwo)))) {
            System.out.println("Your colour combination creates orange!");
        } else if ((colourOne.equalsIgnoreCase("blue") || colourOne.equalsIgnoreCase("yellow") ) && (colourTwo.equalsIgnoreCase("yellow") || colourTwo.equalsIgnoreCase("blue") && !(colourOne.equalsIgnoreCase(colourTwo)))) {
            System.out.println("Your colour combination creates green!");
        } else
            System.out.println("You have not entered two different primary colours.");
    }
}

它的功能完全符合預期,沒有明顯的問題。

但是,它在邏輯上感到笨拙和過度。

我很好奇這個算法是否可以改進。

也許一些布爾值刪除重復項。

boolean isRed = colourOne.equalsIgnoreCase("red") || colourTwo.equalsIgnoreCase("red") ;
boolean isBlue =  colourOne.equalsIgnoreCase("blue") || colourTwo.equalsIgnoreCase("blue") ;

if (isRed && isBlue){
   // ...
} else if (isRed && isYellow) {
  // ...

您可以將輸入字符串(在我的情況下為AS小寫字符串)放入Set中,並可以調用Sets contains。

如果setContains(red)->檢查是否包含黃色或藍色。 現在您可以選擇setContains(blue)或setContains(yellow)並測試是否存在其他一種顏色,因為通過這種方式,顏色的組合無關緊要,並且測試了所有可能的情況。 黃色和藍色將與藍色和黃色相同。

Set<String> set = new HashSet<String>();
set.add(colourOne.toLowerCase());
set.add(colourTwo.toLowerCase());

if(set.contains("red")){
    if(set.contains("blue")){
        //return purple
    }
    if(set.contains("yellow"){
        //returnorange
    }
}
if(set.contains("yellow")){
    if(set.contains("blue"){
        //return green
    }
}
//unidentified colour

可用的另一個選項是將它們存儲在列表中。 然后,您可以檢查列表中是否有顏色。

例如

String colourOne = "blue";
String colourTwo = "red";

List<String> colours= new ArrayList<String>(2);
colours.add(colourOne);
colours.add(colourTwo);


if((colours.contains("red") && colours.contains("blue")
    System.out.println("Your colour combination creates purple!");
etc

這看起來像是使用枚舉的理想場所。

enum COLOR{
  RED,GREEN,BLUE,BLACK,WHITE; //etc.
}

然后,您可以使用一種方法將用戶輸入的字符串轉換為顏色:

public static final COLOR convertToColor(final String input){
    try{
        return COLOR.valueOf(input.toUpperCase());
    }catch(IllegalArgumentException e){
       //invalid color, handle it properly
       System.out.println(input + " is not a valid color !! Enter a new valid color this time!!");
       return null;
    }
}

public static void colourMixer() {
    Scanner in = new Scanner(System.in);
    COLOR color1;
    COLOR color2;

    System.out.print("Enter your first colour: ");
    do{
       color1 = convertToColor(in.nextLine());
    }while( color1 == null);

    System.out.print("Enter your second colour: ");
    do{
       color2 = convertToColor(in.nextLine());
    }while( color2 == null);

    if(COLOR.RED.equals(color1) && COLOR.BLUE.equals(color2)){
          System.out.println("Your colour combination creates purple!");
    }else if(COLOR.RED.equals(color1) && COLOR.YELLOW.equals(color2)){
           System.out.println("Your colour combination creates orange!");
    }//....


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM