4

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

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

如何压缩此示例代码:

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

8 回答 8

9

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

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

然后,一旦程序关闭并开始工作,您就可以了解适合从源代码外部加载参考数据的任何技术,无论是文件、数据库、Web 服务或其他什么。

于 2012-09-19T23:20:31.670 回答
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());
于 2012-09-19T23:25:22.763 回答
1

Because the atomic mass of the elements is not going to change at any point in your app, you should define them as final:

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

...or, you could use an enum:

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

    private int atomicMass;

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

If you order your elements sequentially (and add an UNKNOWN for 0) you wouldn't even need to explicitly provide the mass.

于 2012-09-19T23:29:06.617 回答
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()”来找到给定数字的那个。

如果您想包括已知同位素等,您甚至可以扩展它……如果您的要求要求这样做。

于 2012-09-20T02:05:33.087 回答
0

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

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

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

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

于 2012-09-19T23:22:42.017 回答
0

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

于 2012-09-19T23:37:39.143 回答
0

如果我理解正确,您只想有 1 个变量来存储所有元素及其质量,在这种情况下,我建议使用 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));
}
于 2012-09-19T23:43:28.947 回答
0

将数据存储在文件中

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

伪代码:

//Read data file into a `Map<String, int>`
//Get user input
//Access map
//Output
于 2012-09-19T23:46:20.610 回答