我会快速解决这个问题.我有一个简单的课程
class Vector{
float x, y;
}
Run Code Online (Sandbox Code Playgroud)
另一个类有这些对象的数组作为其成员
Vector[] buffer;
Run Code Online (Sandbox Code Playgroud)
我像这样初始化它:
buffer = new Vector[8];
for(Vector v: buffer)
v = new Vector();
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在这个数组中访问这个对象的成员时,我直接得到一个NullPointerException到我的堆栈跟踪.也就是说,尚未构造数组的对象.另一方面,这个更传统的代码非常完美:
buffer = new Vector[8];
for(int i = 0; i<8; i++)
buffer[i] = new Vector;
Run Code Online (Sandbox Code Playgroud)
正如本讨论所指出的那样,编译后两者都应该相同.
我的问题是,为什么每个循环都无法从项目数组初始化/构造对象?
我是 Java 新手。我正在阅读某人对一个问题的解决方案,我遇到了这个:
int[] ps = new int[N];
for (int i = 0; i < N; i++)
ps[i] = input.nextInt();
int[] counts = new int[1005];
for (int p : ps)
counts[p]++;
Run Code Online (Sandbox Code Playgroud)
最后两行有什么作用?
我已经像这样设置了一个HashMap:
Map<String, ArrayList<String>> theAccused = new HashMap<String, ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)
...我通过存储每个名称(键),一个名称列表(值)来填充它.所以:
ArrayList<String> saAccused = new ArrayList<String>();
// populate 'saAccused' ArrayList
...
// done populating
theAccused.put(sAccuser, saAccused);
Run Code Online (Sandbox Code Playgroud)
所以现在,我想查看HashMap中的所有条目,看看(对于每个'sAcucuser')列表'saAccused'是否包含某个名称.到目前为止,这是我失败的尝试:
Set<String> setAccusers = theAccused.keySet();
Iterator<String> iterAccusers = setAccusers.iterator();
iterAccusers.next();
ArrayList<String> saTheAccused;
// check if 'sAccuser' has been accused by anyone before
for (int i = 0; i < theAccused.size(); i++) {
saTheAccused = theAccused.get(iterAccusers);
if (saTheAccused.contains(sAccuser)) {
}
iterAccusers.next();
}
Run Code Online (Sandbox Code Playgroud)
...但是我不确定Set和Iterator类是如何工作的:/问题是我没有"值"...名称... 'sAccuser's ...用于HashMap可用.
简而言之,我想迭代HashMap并检查特定名称是否存储在任何列表中.那我该怎么做呢?如果您需要我进一步了解或清除任何混淆,请告诉我.
谢谢.
String[] strs = new String[] { "1", "2", ... , "6" };
for (String s : strs) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
这是关于java internals的问题.
在上面的代码示例中,foreach循环如何计算出数组的长度?数组实际上是内部对象还是使用sizeof前端程序员无法访问的东西?
我有一种感觉,我只是错过了一些愚蠢的东西,但我觉得它也很酷.:-)
我刚开始学习Java,我遇到的第一件事是foreach循环,不知道它的工作方式我做的第一件事是:
int[] array = new int [10];
for (int i: array){
i = 1;
}
Run Code Online (Sandbox Code Playgroud)
显然无法分配1给数组的每个元素.然后我添加System.out.print(i);(后i = 1;)到循环的主体,看到屏幕的输出是,1111111111但因为i在循环内做一些事情是有效的,很可能i是数组的每个元素的副本,不是吗?(第一个问题)
如果上述情况属实,这并不意味着foreach循环比公共for循环要慢得多,因为它涉及制作数组中每个元素的副本?或者既然Java没有指针和指针算术,oprator[]可能会以其他一些"糟糕"的方式设计复制每个元素实际上更快?
如果上述假设为真,为什么人们会使用明显较慢的foreach循环而不是共同的for循环呢?
简而言之:
是i每个元素的副本array吗?如果不是那么呢?
foreach循环不是比普通循环慢吗?如果没有,那么operator[]设计的"糟糕"程度如何?
除了在foreach循环中获胜的可读性之外别无其他吗?
好吧,我有一个原始的对象数组,因为我无法从数组中删除它们,我改为将数组中对象的位置更改为null.但是,如果我想以下列方式迭代数组中的每个对象:
for (Derp derp : derps){
derp.herp++;
}
Run Code Online (Sandbox Code Playgroud)
我必须这样做吗?
for (Derp derp : derps){
if (derp != null){
derp.herp++;
}
}
Run Code Online (Sandbox Code Playgroud)
或者我第一次拥有它会没事吗?for循环'知道'它只需要迭代Derp对象,而不是空对象,因为我已经将它声明为Derp对象吗?或者它可能只是将它视为Derp对象,因为我已经说过它会在尝试迭代非Derp对象时导致错误?或者null仍然是一个Derp对象,只有一个为null?它是什么,我可以使用什么代码?
或者,如何从基本数组中删除对象而不留下空对象并实际缩短基本数组的长度?
美好的一天,
有人可以确认在这篇文章的底部说了什么java - 迭代一个链表 该帖子提到你可以使用for(char c:linkedlistofchars)语法,它仍然是O(n).我想要访问一个看起来像这样的列表......
a b c d e f
Run Code Online (Sandbox Code Playgroud)
实际上在for循环的每次迭代期间都会在链表的开始处运行,就像这样......
a ab abc abcde abcdef
Run Code Online (Sandbox Code Playgroud)
导致访问时间不是O(n).
这究竟是如何工作的?它对数组和数组运算符有意义,但java语法如何知道如何使用java中的foreach循环遍历链表?
我认为LinkedList数据结构只是一个额外的库,而不是核心语言语法的一部分.(我确实知道LinkedList类在java中是标准的)
我希望我能够清楚地解释我的担忧....谢谢
我是一名普通的3D艺术家,从我的职业生涯开始,开始学习编程.我对c106a讲义#5有疑问.
代码有效,但我在这里仍然有一些错误日志.
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at UniqueNames.showUnique(UniqueNames.java:23)
at UniqueNames.main(UniqueNames.java:39)
Run Code Online (Sandbox Code Playgroud)
为什么Arraylist能够自行扩展其容量仍然可以获得OutOfBoundsException?
这是我的完整代码:
import acm.io.*;
import acm.program.ConsoleProgram;
import acm.util.*;
import java.io.*;
import java.util.ArrayList;
import java.lang.*;
public class UniqueNames extends ConsoleProgram{
static ArrayList<String> meString = new ArrayList<String>();
static String input ;
public static void storeUnique(String input){
if (!meString.contains(input))
{
meString.add(input);
}
}
public static void showUnique(ArrayList<String> meString){
System.out.println("Unique name list contains:");
for(int i=0 ;i<= meString.size() ;i++){
System.out.println(meString.get(i));
}
} …Run Code Online (Sandbox Code Playgroud) 这篇文章解释了foreach循环直接对应于使用迭代器.如果我写一个foreach循环,它真的会转换成for for iterator?特别是给定的循环:
for(Integer i : createList()){
System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)
createList()无论如何,我保证总是只打一次电话吗?它被重写为:
for(Iterator<Integer> i = createList().iterator(); i.hasNext(); ) {
System.out.println(i.next());
}
Run Code Online (Sandbox Code Playgroud)
在某种中间步骤或恰好产生与上述相同的字节码?
我不明白为什么我不能使用增强的for循环为数组的元素赋值.例如,使用for循环
int[] array = new int[5];
for(int i = 0; i < 5; i++)
array[i] = 10;
Run Code Online (Sandbox Code Playgroud)
生产我想要的东西.但为什么这不适合"为每个人":
for(int element : array)
element = 10;
Run Code Online (Sandbox Code Playgroud)
有没有具体原因导致这种情况或我做错了什么?