3

我是 Java 的初学者,我才刚刚开始自学数组和列表。以下是我为在线礼品登记练习提出的代码片段,虽然我了解其中的大部分内容,但有时我不得不反复试验,直到代码最终显示出我想要的输出。这里有几个问题:

System.out.println("Enter item: ");
gift.add(x.next()); 
System.out.println("Enter store: ");
store.add(x.next());

这是用户输入礼物时的代码以及他可以从中购买礼物的商店。我发现如果输入以空格分隔的单词,输出将如下所示:

Do you wish to make a gift wish list? [Y/N]
Y
Enter item: 
High heels
Enter store: 
Any more items? [Y/N]

问题1:为什么会发生这种情况?我在代码的早期声明这是一个字符串(一个ArrayList,但是一个<String>),即使我修改了 Scanner 方法,(x.nextLine());我仍然会在控制台中打印它。当用户输入一个单词的答案时,代码可以正常工作,但我仍然想知道为什么会发生这种情况,以及允许带有空格的条目的可能替代方案是什么。

问题#2:这部分代码,我不得不在互联网上查找。没有任何解释为什么这是必需的,但代码仍然有效。

for (int i = 0; i < gift.size(); i++) {
    System.out.print(gift.get(i)+ " - ");
    System.out.print(store.get(i));
    System.out.println("");
}

在我发现这一点之前,我最初是从用户输入项目开始的System.out.println("Gift List: \n" + gift + " - " + store);,当显示用户输入项目时,它们位于括号中并用逗号分隔。这段代码中 i 的值是多少,为什么要增加它?我还尝试将giftin更改gift.size();store并且代码仍然可以正常工作。顺便说一句,这是为什么?我们只是选择放置哪些变量,还是遵循某种语法?

提前致谢。

编辑:这是完整的代码。

package arrays;

import java.util.ArrayList;
import java.util.Scanner;
public class GiftList {

    public static void main(String[] args) {
        Scanner x=new Scanner (System.in);

    char ans;
    ArrayList<String> gift= new ArrayList<String>();
    ArrayList<String> store = new ArrayList<String>();

        System.out.println("Do you wish to make a gift wish list? [Y/N]");
            ans=x.next().toLowerCase().charAt(0);

        while (ans!='n')

        {
            System.out.println("Enter item: ");
            gift.add(x.nextLine());
            System.out.println("Enter store: ");
            store.add(x.nextLine());

            System.out.println("Any more items? [Y/N]");
            ans=x.next().toLowerCase().charAt(0);
        }

        System.out.println("Gift List: ");
        for (int i = 0; i < gift.size(); i++) {
            System.out.print(gift.get(i)+ " - ");
            System.out.print(store.get(i));
            System.out.println("");
        }
    }

}
4

3 回答 3

1

问题2:

Lists 一般ArrayList是其中一种,用于按顺序存储对象列表。它们类似于数组,但在数组具有固定大小的情况下,列表可以使用该add()方法增长)。

返回列表中第 i 个项目的get(int i)方法,从零开始(因此获取第一个项目,获取第二个项目等)Listlist.get(0)list.get(1)

size()方法返回列表中的项目数。因为get()是从零开始的,所以您可以使用 0(第一项)和 size()-1(最后一项)作为get方法的参数。

在这里,您在循环中使用这些方法,因此您从 0 迭代到 size()-1 以获取列表中的所有项目。

当您更改循环时gift.size()store.size()它仍然有效,因为列表的大小相同(对于您输入到礼品列表中的每个项目,您也输入了一个到商店列表中)。

您需要小心在同一循环中从不同列表中获取项目:有时列表可能大小不同,get(int i)如果您尝试从列表末尾之外获取项目,则会引发异常。

最后,当你有:

System.out.println("Gift List: \n" + gift + " - " + store);   

您正在隐式使用 ArrayList.toString() 方法。此方法呈现列表中的所有元素。在内部,它将使用循环遍历项目。

您可以在此处查看源代码:http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/AbstractCollection.java#AbstractCollection.toString%28% 29

于 2013-11-12T16:59:15.600 回答
1

对问题 2 的回答:

当您将 Object 传递给 methodSystem.out.println(Object obj)时,它将使用toString()Object obj 的方法来显示它。在这种情况下,你显示的对象是一个ArrayList,所以它会使用toString()Object 的ArrayList(实际上它会使用 的toString()方法,AbstractCollection因为ArrayList扩展了这个类)。

第二种打印 List 元素的方法是循环遍历它(这里是for循环)。因此,您需要一个变量(此处i)来访问列表中包含的每个元素)。

于 2013-11-12T16:30:12.380 回答
1

问题一:

您跳过项目列表,因为 x 仍然包含换行符,在添加项目之前调用 x.nextLine() 将解决此问题:

while (ans!='n'){
    x.nextLine(); //Skip the enter keypress
    System.out.println("Enter item: ");
    gift.add(x.nextLine());
    System.out.println("Enter store: ");
    store.add(x.nextLine());

一旦你修复了循环,添加带有空格的礼物就可以了。

你想制作一份礼物愿望清单吗?[是/否]是

进入项目:高跟鞋

进入店铺:我的

还有项目吗?[Y/N] n 礼物清单:高跟鞋 - 我的

问题#2:这部分代码,我不得不在互联网上查找。没有任何解释为什么这是必需的,但代码仍然有效。

for (int i = 0; i < gift.size(); i++) {
        System.out.print(gift.get(i)+ " - ");
        System.out.print(store.get(i));
        System.out.println("");
    }

这是循环的标准i充当列表中每个项目的计数器。gift.size()返回列表中有多少项的整数值,i++使用当前值,i然后在循环完成时将其递增。

因为i在循环的每次迭代中都会递增,所以调用gift.get(i)将返回存储在 index 的值i。所以在第一次迭代i=0,第二次i=1,第三次i=2等等。

至于为什么需要它 - 这不是唯一可行的方法,您可以做一些不同的事情来使其工作相同。虽然我个人发现在这样的例子中循环的标准很容易理解。

这部分代码的关键是您调用store.get(i)此调用获取与列表中相同的索引gift.get()并将返回列表中的相同位置。

我不确定与 store 和 gift 的关系是什么,但似乎HashMap可能是一个更好的集合。HashMap 是键值对的集合。

有时,以 K、V 关系而不是两个单独的集合来组织您的值更有意义。例如,使用 hashmap,您将拥有 store->gift 关系,然后可以遍历显示值的集合。检查链接的文档以获取一些使用示例。

然而,话虽这么说,最好等到你完成书中的相关部分后再等待哈希图,否则你可能会对这些例子感到困惑。

我认为问题 1 需要更多信息才能正确解释为什么它没有按预期工作。你可以发布周围的代码吗?

于 2013-11-12T16:48:52.630 回答