2

for-each ループで LinkedList を構築する方法を見つけようとしています。

私は現在持っている方法を入れましたが、うまくいきます。ループの外側で 1 つの listNode を宣言し、残りを for ループの内側で宣言する必要があるため、非常に見苦しいと思います。これが不器用な解決策であるという気持ちを揺るがすことはできません。

それはどのように書かれています -

private listNode nameList;

public listManager(ArrayList<String> names) {
    nameList = new listNode(names.get(0));
    listNode current = nameList;
    for (int i = 1;  i < names.size(); i++) {
        current.next = new listNode(names.get(i));
        current = current.next;
    }
}

for-each ループを使用して、すべてをもう少し読みやすくしたいのですが、current が null のときに current.next を取得しようとすると問題が発生するため、nullpointerexception が発生します。何か案は?

理想的には書いてほしいのですが、うまくいきません-

listNode current = nameList;
for (String person : names) {
    current.next = new listNode(person);
    current = current.next;
} 

どんな助けでも大歓迎です!:)

4

3 に答える 3

5

私のコメントから:

強化された for ループ、つまり foreach を使用する場合は、その中で null チェックを行う必要があります。

nameList = null;
listNode current = null;
for (String person : names) {
    if (nameList= null) {
        nameList = new listNode(names.get(0));
        current = nameList;
    } else {
        current.next = new listNode(person);
        current = current.next;
    }
}

別の推奨事項: コードを読みやすくするために、listNodeクラス名には CamelCase を使用してください。ListNodelistManagerListManager


@corsiKa のコメントによると、これは拡張ループを使用するのに最適なケースではありませんfor(実際、これは、パフォーマンスへの影響を測定するために話しているアイテムの数に大きく依存しますが、それはこの問題の範囲外です)。List( によって実装される汎用インターフェイス)をサポートする、より汎用的なアルゴリズムにするために、代わりにArrayListを使用できます。Iterator

Iterator<String> iterNames = names.iterator();
if (iterNames.hasNext()) {
    nameList = new listNode(iterNames.next());
    listNode current = nameList;
    while (iter.hasNext()) {
        current.next = new listNode(iterNames.next());
        current = current.next;
    }
}

強化されたループ アプローチを引き続き使用する場合は、そこからチェックforを削除する方法がないことに注意してください。null

于 2013-07-16T21:54:08.683 に答える
0

問題1

完全なコードをコンパイルしないと (とにかく必要以上になる可能性があります)、デバッグするのは困難です。注意すべきことの 1 つは、2 つのループが同一ではないことです。

最初はこれを行います:

for (int i = 1;  i < names.size(); i++) {

2番目はこれを行います

for (String person : names) {

これは本質的に同じです

for (int i = 0;  i < names.size(); i++) {
    String person = names.get(i);

ループは1から始まりますが、生成されたループは0から始まることに注意してください

問題 2

それはさておき、問題は、コードの 2 番目の部分がヘッダー ノード ( namesList) の新しいノードを作成していないように見えることです。

ソリューション

これは、強化された for ループを使用する適切な場所ではありません。拡張 for ループは、構造内のすべての要素に同一の操作が適用される場合にのみ使用してください。この場合、最初のものを特殊なケースとして扱い、コードが複雑になります。1 から始まる最初のループは、この問題を解決する理想的な方法です。

于 2013-07-16T21:54:54.883 に答える