【问题标题】:how can replace more then 16 if else-if statement Java如果 else-if 语句 Java 如何替换超过 16 个
【发布时间】:2020-02-11 01:25:51
【问题描述】:

我正在尝试制作一个允许客户端输入字符串的程序。字符串长度应该只有 3 个字符并且应该包含字母。

我的程序必须通过这个表并检查这个字符串指的是什么..

假设客户端传递了这个字符串“AUG”,我的程序应该显示这个字符串的名称是“Met”。

我编写了一个代码,它可以工作,但它有超过 15 个 if else-if 条件。

我的问题是:有没有其他方法可以在不使用 if else-if(或 switch)的情况下做到这一点。 多态性在这种情况下是否有效?

【问题讨论】:

    标签: java if-statement polymorphism


    【解决方案1】:

    看看HashMap

    您可以使用以下方法构建表格:

    Map<String, String> table = new HashMap<>();
    table.put("AUG", "Met");
    table.put(...);
    

    然后使用用户的输入访问您的表:

    if(table.containsKey(input)){
        return table.get(input);
    }
    

    【讨论】:

    • 如果我使用 HashMap 会更长,因为有 64 种可能性。阿拉的例子:table.put("GCU", "Ala"); table.put("GCC", "Ala"); table.put("GCA", "Ala"); table.put("GCG", "Ala");
    • 您正在寻找inline initialization of a HashMap。您还可以尝试一种简单的数据序列化技术,例如 importing from a CSV(标准库)。
    • 如果您要在程序中多次访问该表,那么填充一个 hashmap 并运行 get 方法将比为每个用户输入运行 16 个 if 语句更有效。事实上,您的程序将使用 64 条数据。您可以使用哈希映射将其保存在内存中,或者每次使用 if 语句计算映射。据我所知,恐怕没有一个好的方法可以做到这一点。
    【解决方案2】:

    我想我会亲自使用enum 来解决这个问题(假设性能不是一个重要问题):

    public enum Abbreviations {
        Ala("GCU", "GCC", "GCA", "GCG"),
        Arg("CGU", "CGC", "CGA", "CGG", "AGA", "AGG")
        // ...
        ;
    
        private final List<String> codons;
    
        private Abbreviations(final String... codons) {
            this.codons = Arrays.asList(codons);
        }
    
    
        public boolean contains(final String codon) {
            return this.codons.contains(codon);
        }
    }
    

    然后你可以使用类似的东西从String 中找到它们的匹配项:

    public String find(final String codon) {
        for (final Abbreviations abb : Abbreviations.values()) {
            if (abb.contains(codon)) {
                return abb.name();
            }
        }
    
        throw new IllegalArgumentException("Unknown codon: '" + codon + "'");
    }
    

    【讨论】:

    • (我会更进一步,有一个Nucleotidesenum,和一个Codonsenum,它有一个构造函数采用三个Nucleotides,然后让你的Abbreviations类接受 Codons 的可变参数数组以采用完全面向对象的方法......但这对于快速回答来说似乎有点过分......)
    • 如果我有一个 ArrayList,每个元素对应一个密码子(例如:“AUG”),find 方法会是什么样子?我试图改变它的类型和参数,但它给了我错误
    • @Beee:我不明白这个问题。已经为此处的每个 Abbreviations 生成了 List&lt;String&gt;,因此搜索方法将与此处一样。
    【解决方案3】:

    您可以尝试面向对象的方法:

    //This is your representation of Codon
    //Which has a name e.g. Alanine and an Abreviation object.
    public class Codon {
    
            private String name;
    
            private Abreviation abreviation;
    
            public Codon(String name, Abreviation abreviation) {
    
                this.name = name;
                this.abreviation = abreviation;
                this.abreviation.addCodon(this);
    
            }
    
            @Override
            public String toString() {
                return "Codon [name=" + name + ", abreviation=" + abreviation + "]";
            }
    
    
        }
    
    import java.util.ArrayList;
    import java.util.List;
    // This is a representation of an abreviation object
    // Which has an abreviation: ALA;
    // and the name of the abreviation "Alanine".
    public class Abreviation {
    
        private String abreviation;
        private String name;
        private List<Codon> codons = new ArrayList<>();
    
        public Abreviation(String abreviation, String name) {
            super();
            this.abreviation = abreviation;
            this.name = name;
    
        }
    
        public boolean addCodon(Codon codon) {
            return this.codons.add(codon);
        }
    
        @Override
        public String toString() {
            return "Abreviation [abreviation=" + abreviation + ", name=" + name + "]";
        }
    
    }
    
    
    // Here is your program, where it's being build all the Codons structure with your respective Abbreviation.
    public class App {
    
        public static void main(String[] args) {
            // This is abreviation, it'll will associated with the codon 
            Abreviation alanine = new Abreviation("Ala", "Alanine");
            // Here it's being build the codon CGU, which has abreviation alanine
            Codon GCU = new Codon("GCU", alanine);
            // Then using toString method it prints what have been done 
            System.out.println(GCU);
    
        }
    
    }
    

    您可以将所有密码子放入一个列表中,以便随后进行搜索和检索。

    【讨论】:

    • 你想详细解释你的代码在做什么,老兄?没有解释,它看起来就像一个代码块......
    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2019-04-09
    相关资源
    最近更新 更多