如何避免使用大量变量?

时间:2012-09-19 23:15:18

标签: java variables

我想创建一个简单的程序,输出输入的任何元素的原子质量。我正在学习我最近开始的Java课程,所以我不知道如何避免使用超过100个变量,每个变量都包含元素原子质量。

另外,如何使用if语句来使用用户输入的名称(我知道如何存储在字符串中)并将其与其中一个元素匹配,以便输出元素的质量(对应于用于存储多个元素的方法)。

如何压缩此示例代码:

int carbon = 12;
int oxygen = 16;
int hydrogen = 1;
int sulfur = 32;
etc....

8 个答案:

答案 0 :(得分:9)

听起来您的第一步是了解地图数据结构。您可以使用它将字符串名称与整数值相关联,然后稍后再查看它们。

Map<String, Integer> elements = new HashMap<String, Integer>();
elements.put("CARBON", 12);
elements.put("OXYGEN", 16);
//etc

然后,如果你有一些输入,你可以查找数字。

String userInput = scanner.next(); // or however you're getting input

Integer atomicWeight = elements.get(userInput.toUpper());
if (atomicWeight == null) //print element not found etc

然后,一旦你完成了程序并且正常工作,你就可以了解适用于从源代码外部加载参考数据的任何技术,无论是文件,数据库还是网络服务等等。

答案 1 :(得分:3)

如果遇到这个问题,我可能会定义一个枚举。

public enum Elements
{
    HYDROGEN(1),
    ...
    UNOBTANIUM(666);

    public final int atomicWeight;


    Elements(int atomicWeight)
    {
       this.atomicWeight = atomicWeight;
    }
}

然后获得正确的元素

String name = ...// from user input
Elements e = Elements.valueOf(name.toUpperCase());

答案 2 :(得分:1)

因为元素的原子质量在应用中的任何一点都不会改变,所以你应该将它们定义为最终:

public class AtomicMass {
    public static final int CARBON = 12;
    public static final int OXYGEN = 16;
    ...
}

......或者,您可以使用枚举:

public static enum Element {
    carbon(12),
    oxygen(16),
    hydrogen(1),
    sulfur(32);

    private int atomicMass;

    private Element( int mass ) {
        this.atomicMass = mass;
    }
}

如果按顺序排序元素(并为0添加UNKNOWN),则甚至不需要显式提供质量。

答案 3 :(得分:1)

我建议使用枚举,正如有人建议的那样,尽管我做的有点不同。地图有很多开销,因为你的数据不是动态的,所以不太合适。原子质量应该是十进制值(double或BigDecimal取决于你使用它的原因),而不是int

public enum AtomicElement {
    HYDROGEN(1.00794),
        HELIUM(4.002602),
        ...;

    private double atomicMass;

    private AtomicElement (double atomicMass) {
        this.atomicMass = atomicMass;
    }

    public int getAtomicNumber() {
        return ordinal();
    }

    public double getAtomicMass() {
        return atomicMass;
    }

    public static AtomicElement forAtomicNumber(int atomicNumber) {
         return AtomicElement.values()[atomicNumber];
    }

    public static AtomicElement forElementName(String elementName) {
         return AtomicElement.valueOf(elementName);
    }

}

然后你可以按原子序数或元素名称搜索

   AtomicElement.forAtomicNumber(2);
   AtomicElement.forElementName("CARBON");

但是,假设您将代表整个元素周期表,数据中没有间隙,因为它使用ordinal()值作为原子序数。如果你想要间隙,你必须有一个原子序数的int字段,你的“forAtomicNumber”函数必须循环“values()”以找到具有给定数字的那个。

如果你想要包括已知的同位素等,你甚至可以扩展它......如果你的要求决定了这一点。

答案 4 :(得分:0)

我喜欢将相关数据分组到数组或数组列表中。

String[] elements = new String[# of elements in table];

根据元素的位置,你可以得到原子序数。

然后我会遍历它们以找到任何元素或填充数组。 您可以查看Java Scanner类以获取用户的输入。

答案 5 :(得分:0)

创建一个名为Element的类,其中包含名称,原子序数等属性。每个元素都对应一个Element的实例。然后,您可以将所有Elements放在多个映射中,按名称,原子序数等键入。使用工厂类实例化和初始化映射,并提供查找方法。

答案 6 :(得分:0)

如果我理解正确你只想有一个变量来存储所有元素及其质量,在这种情况下我会推荐一个HashMap。它不会真正节省代码行,但会让你很容易做到2号。 HashMaps存储一组键值对,如果你有键,你可以得到值,这样就可以创建列表:

//Declare a new hashmap and initialize it
HashMap<String, Integer> elements = new HashMap<>();

//Add element information
elements.put("CARBON", 12);
elements.put("OXYGEN", 16);
elements.put("HYDROGEN", 1);
elements.put("SULFUR", 32);

然后例如从对话框中获取用户输入并将结果打印到命令行,您可以执行以下操作:

//Collect user input and convert it to all upper case (in real life you would validate this)
String input = JOptionPane.showInputDialog(null, "Please enter an element name").toUpperCase();

//If element name exists in hashmap print its atomic weight
if(elements.containsKey(input.toUpperCase())){
    System.out.println("Atomic Weight: " + elements.get(input));
}

答案 7 :(得分:0)

将数据存储在文件中

Element, Weight
oxygen = 16
carbon, 12
.
.
.

伪代码:

//Read data file into a `Map<String, int>`
//Get user input
//Access map
//Output