" HELL IS ANOTHER PEOPLE"
  
  之前在用Java写一道复杂模拟(hdu2300) 的时候想用类似C/C++中memset的初始化函数来给数组赋值,于是请教了正在学面向对象语言的牛哥,牛哥说可以试一试Arrays.fill这个方法。但在我实际使用之中,发现Java的这个方法局限性很大,毕竟Java是通过JVM来实现编译,没有了指针这个直接操作内存的法宝,Java的内存操作实在有些鸡肋。而Arrays.fill这个方法也只能实现对一维数组的填充,完全不支持多维数组和结构体,实在非常拉胯。网上也有说可以将多维数组看成多个一维数组来赋值,比如

1
2
3
4
5
6
7
8
public class App {
public static void main(String[] args) {
int akiyamamio[][] = new int[10][10];
int lky[] = new int[10];
Arrays.fill(lky,0);
Arrays.fill(akiyamamio,lky);
}
}

但这样填充之后二维数组其实是akiyamamio[10][]的形式,你修改二维数组时其实修改的是填入的一维数组,比如你akiyamamio[0][0]=1,结果是akiyamamio第0行的所有元素都被赋值为了1,实在是令人匪夷所思。
  所以在Java中到底该如何快速填充数组呢?牛哥支支吾吾半天给出的答案是———不能。所以还是老老实实用for循环来给数组填充吧。
1
2
3
4
5
6
7
8
9
10
public class App {
public static void main(String[] args) {
int akiyamamio[][] = new int[10][10];
for (int o = 0; o < 10; o++) {
for (int p = 0; p < 10; p++) {
akiyamamio[o][p] = 0;
}
}
}
}

  之后又写了一道简单的队列题(hdu1972) 使用list写出列入列时(其实Java用Queue来写就行了)抛出了Exception。
1
2
3
4
5
6
7
8
9
10
public class App {
public static void main(String[] args) {
ArrayList<Integer> Murasame = new ArrayList();
for (int lky : Murasame) {
int maxx = Collections.max(Murasame);
int delnow = Murasame.indexOf(maxx);
Murasame.remove(delnow);
}
}
}

看了下书,大概是使用foreach循环时Java是通过工厂方法来调用Iterator接口在内部创建了一个新的Iterator对象,而新对象的size等于原来list的size。如果在迭代时对原list使用remove()后显然Iterator的长度会大于list进而抛出越界异常(大概就是C的下标越界了)至于解决方法,由于牛哥最近不是在陪江南哥青训就是和洋马谈情说爱。自己摸索了一下其实按解决C中下标越界的思路来写就行了。
1
2
3
4
5
6
7
8
9
10
11
12
public class App {
public static void main(String[] args) {
ArrayList<Integer> Murasame = new ArrayList();
Iterator<Integer> youdao = Murasame.iterator();
while (youdao.hasNext()) {
int maxx = Collections.max(Murasame);
int delnow = Murasame.indexOf(maxx);
Murasame.remove(delnow);
youdao=Murasame.iterator();
}
}
}

自己学Java差不多也有大半学期了,Java给我的感觉(某牛:没有运算符重载看着费劲)确实是比C/C++精简了许多,也更便于维护。但在有些地方Java对减少复杂性的追求也造成了一些让人摸不着头脑的问题(某牛:为什么不用Python)。而一些基础的for,while语句也是有存在意义的。因为写for时没有用auto而被牛博士痛批  

写这篇博客时已经是五月十三日,恰好是大和赤骥 我的第一匹A马 的生日,所以就在博客里祝赤宝 十一个孩子的妈妈 生日快乐了。

大和赤骥