有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中使用开关块而不是多个if语句的字符串

public class A {
  public void search(boolean[] searchList) {
    // searchList array is used to identify what options to search for in a given order
   // e.g. boolean [] searchList = new boolean [] {false, false, true, false};
    boolean searchL = false;
    boolean searchM = false;
    boolean searchK = false;
    boolean searchA = false;

    if(searchList[0] == true) searchL = true;
    if(searchList[1] == true) searchM = true;
    if(searchList[2] == true) searchK = true;
    if(searchList[3] == true) searchA = true;

    if(searchL == true) // write a query to search for all Ls
    if(searchM == true) // write a query to search for all Ms
    ...........
}

有没有办法简化这段代码

@All:很抱歉之前发布了一个错误的问题。我很困惑

谢谢, 索尼


共 (5) 个答案

  1. # 1 楼答案

    public class A {
    
        public enum SearchOption {
            SEARCH_L,
            SEARCH_M,
            SEARCH_A,
            SEARCH_K;
        }
        /**
         * Make them pass in an enum for your search.
         * Pros: type safe, can only use the selections you give
         * Cons: must add to the enum to add new types
         * @param option
         */
        public void enumSearch(SearchOption option) {
    
            switch(option) {
            case SEARCH_A:
                System.out.println("I am searching for A");
                break;
            case SEARCH_K:
                System.out.println("I am searching for K");
                break;
            case SEARCH_L:
                System.out.println("I am searching for L");
                break;
            case SEARCH_M:
                System.out.println("I am searching for M");
                break;
            }
        }
    
        /**
         * Use a primitive for your input
         * Pros: Gives you more options without updating the enum
         * Cons: Users could enter input you don't really want them to use
         * @param option
         */
        public void charSearch(char option) {
            switch(option) {
            case 'a':
            case 'A':
                System.out.println("I am searching for A");
                break;
            case 'k':
            case 'K':
                System.out.println("I am searching for K");
                break;
            case 'l':
            case 'L':
                System.out.println("I am searching for L");
                break;
            case 'm':
            case 'M':
                System.out.println("I am searching for M");
                break;
            }
        }
    
        /**
         * Use a primitive and don't even actually check it! Just run with it!
         * @param option
         */
        public void uncheckedSearch(char option) {
            System.out.println("I am searching for " + option);
        }
    }
    

    根据你的评论,下面是我更新的方法示例——确保顶部的评论已更新

    /**
     * Perform the search based on the options provided
     * The list should be in the order of L, M, A, K
     * @note update this comment as more search options are added
     * @param searchList the list of flags indicating what to search for
     */
    public void search(boolean[] searchList) {
    
        // as per docs, [0] denotes an L search:
        if(searchList[0]) 
            // write a query to search for all Ls
    
        // as per docs, [1] denotes an M search:
        if(searchList[1]) 
            // write a query to search for all Ms
    
        // as per docs, [2] denotes an A search:
        if(searchList[2]) 
            // write a query to search for all As
    
        // as per docs, [3] denotes a K search:
        if(searchList[3]) 
            // write a query to search for all Ks
    }
    

    最新想法:

    // Use the SearchOption enum from above
    Map<SearchOption, String> searches = new HashMap<SearchOption, String>();
    
    public List<SearchResult> search(List<SearchOption> options) {
        List<SearchResult> results = new LinkedList<SearchResult>();
        for(SearchOption option : options) {
            String query = searches.get(option);
            SearchResult result = MySearchService.executeQuery(query);
            results.add(result);
        }
        return results;
    
    }
    
  2. # 2 楼答案

    您应该将状态转换为枚举。例如,你的搜索布尔值似乎是排他性的,所以我会这样做:

    enum SearchOption {
      searchA, searchK, searchL, searchM
    }
    
    // then you can do 
    
    SearchOption searchOption = searchA;
    
    switch (searchOption) {
      case searchA: 
        System.out.println("I am searching for A");
        break;
      case searchK: 
        System.out.println("I am searching for K");
        break;
      case searchL: 
        System.out.println("I am searching for L");
        break;
      case searchM: 
        System.out.println("I am searching for M");
        break;    
    }
    

    如果你的州不是排他性的,你应该试着先建立一个超级排他性州

  3. # 3 楼答案

    像这样:

    public class A {
      public void search() {
    
        private static final int SEARCH_L = -1;
        private static final int SEARCH_M = 0;
        private static final int SEARCH_A = 1;
        private static final int SEARCH_K = 2;
    
    int status;
    
    switch(status){
     case SEARCH_L:
        System.out.println("I am searching for L");
      break;
     case SEARCH_M:
        System.out.println("I am searching for M");
      break;
     // Etc
    
     default:
        // Log error didn't hit a known status
       break;
    }
    

    }

  4. # 4 楼答案

    为什么不使用OOP?比如:

    public interface Seeker {
       void seek();
    }
    public class LSeeker implements Seeker {
       void seek() { System.out.println("Will search for L"); }
    }
    // ... More implementations of Seeker
    public class SeekDriver {
       void seek(Seeker seeker) { seeker.seek(); }
    }
    
  5. # 5 楼答案

    我是Enum的超级粉丝:

    public class A {
      enum SearchType {
       L, M, A, K;
     }
      public void search(SearchType type) {
    
        switch (type) {
         case L: 
              System.out.println("Searching for L");
              break;
         case M:
              System.out.println("Searching for M");
              break;
         case A: 
              System.out.println("Searching for A");
              break;
         case K:
              System.out.println("Searching for K");
              break;
         default:
              System.out.println("what to do here?");
              // throw exception?
    }
    

    另外请注意:您的场景允许一次有多个搜索布尔值为真,我假设这不是您的目标,但如果是,我们可以稍微调整一下