4

入力した元素の原子量を出力する簡単なプログラムを作成したいと思います。最近始めたJavaコースを受講しているので、それぞれが原子量の要素を持つ100を超える変数を使用しないようにする方法がわかりません。

またif、要素の質量を出力するために、ユーザーから入力された名前(文字列に格納する方法を知っています)を使用して要素の1つと照合するステートメントを取得するにはどうすればよいですか(格納に使用されるメソッドに対応します)複数の要素)。

このサンプルコードを要約するにはどうすればよいですか?

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

8 に答える 8

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

次に、プログラムを停止して動作させると、ファイル、データベース、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

要素の原子量はアプリのどの時点でも変化しないため、最終的なものとして定義する必要があります。

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を追加する)場合は、質量を明示的に指定する必要はありません。

于 2012-09-19T23:29:06.617 に答える
1

少し違う方法ですが、一部の人が示唆しているように列挙型を使用することをお勧めします。マップには多くのオーバーヘッドがあり、データは動的ではないため、最適ではありません。原子量は、intではなく、10進値(使用目的に応じてdoubleまたはBigDecimal)にする必要があります。

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

Element名前、原子番号などの属性を含むと呼ばれるクラスを作成します。各要素はのインスタンスに対応しますElement。次に、名前や原子番号などでキー設定されたすべてのElementsマップを複数のマップに配置できます。ファクトリクラスを使用して、マップをインスタンス化および初期化し、ルックアップメソッドを提供します。

于 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

関連するデータを配列またはarrayListsにグループ化するのが好きです。

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

要素の位置に基づいて、原子番号を指定できます。

次に、それらをループして要素を見つけるか、配列を埋めます。Java Scannerクラスを調べて、ユーザーからの入力を取得できます。

于 2012-09-19T23:22:42.017 に答える
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 に答える