我对java语言的了解非常新。我的大部分知识来自谷歌搜索如何做事。我一直在研究使用switch语句的java控制台程序。整个程序使用String [20] [5]数组。我已经编写了代码,现在可以添加条目,将数组保存到文件,将文件中的条目加载到数组中。
现在的问题是编辑和删除条目。我能够将值返回null但它看起来像[[null],[null,null,null,null,null]。
我希望该值返回[null,null,null,null,null],[null,null,null,null,null]。
Edit条目有些原因会返回java.lang.ArrayIndexOutOfBoundsException:1。
有人可以指出我的错误吗? Array也是全局声明的。
public static String[][] rem(){
Scanner input = new Scanner(System.in);
int x,y=0;
//for(int i=0;i<array.length;i++){
//if(array[i][0]!=null){
System.out.println(Arrays.deepToString(array));//}
//}
System.out.println("Which entry would you like to remove? "
+ "\n" + "Enter number 0 - 20");
x = input.nextInt();
array[x][y]=null;
return array;}
public static String[][] edit(){
Scanner input = new Scanner(System.in);
String k;
int j;
int g;
// for(int i=0;i<array.length;i++){
//if(array[i][0]!=null){
//System.out.println(Arrays.deepToString(array));}
//}
System.out.println("Which entry would you like to edit? "
+ "\n" + "Enter number 0 - 20");
j = input.nextInt();
System.out.println("What would you like to edit? "
+"\n" + "Enter number 0 - 5");
g = input.nextInt();
System.out.println("You are now editing.");
k = input.next();
array[j][g] = k;
return array;}
更新
我想我认为我的问题。数组正确编辑我手动输入的值。当我将数据加载到导致问题的数组中时,因为当它加载数据时它会加载为String []。我需要一个代码,将数据加载为String [] []或数组数组。
public static String[][] load()throws FileNotFoundException, IOException{
menu();
copyFile();
String file = ("c:/temp/Address.txt");
Scanner scan = new Scanner(new FileReader(file));
// initialises the scanner to read the file file
//String[][] entries = new String[100][3];
// creates a 2d array with 100 rows and 3 columns.
//int i = 0;
while(scan.hasNextLine()){
array[i][i] = scan.next().split("," , "\t");
i++;
}
//loops through the file and splits on a tab
//for (int row = 0; row < array.length; row++) {
// for (int col = 0; col < array[0].length; col++) {
// if(array[row][col] != null){
// System.out.print(array[row][0] );
// }
// }
// if(array[row][0] != null){
// System.out.print("\n");
//}
// }
//prints the contents of the array that are not "null"
selectMenu();
return array;}
更新2
我找到了解决加载数据问题的解决方案。解决方案很简单!我将把代码留在这里以供参考。虽然,所有的代码都可以使用一些美化。
public static String[][] load()throws FileNotFoundException, IOException{
menu();
copyFile();
String file = ("c:/temp/Address.txt");
Scanner scan = new Scanner(new FileReader(file));
FileReader fr = new FileReader("c:/temp/Address.txt");
BufferedReader br = new BufferedReader(fr);
//int j=0;
//int lineNo = 0;
//String line = br.readLine();
//while(line!=null)
//{
//for(int i = 0; i < 5; i++)
//{
//array[lineNo][i] = line.substring(i,4);
//}
// lineNo++;
//line = br.readLine(); // This is what was missing!
//}
//while(scan.hasNextLine()){
//while(scan.hasNext()){
//for(j=0;j<5;j++){
for(int i = 0; i < 20; ++i){
for(int j = 0; j < 5; ++j)
{
if(scan.hasNext())
{
array[i][j] = scan.next();
//i++;
//j++;
}
//i++;
}
}
selectMenu();
return array;}
更新3
因此在弄清楚如何使用分隔符后,它给我一个奇怪的问题。它在列的末尾添加了返回值。 [null,null,null,null,null return]。我使用“,| \ n”作为我的分隔符。有更好的方法吗?更新:添加.trim();用load来解决最后的问题。现在它在当前的工作中已经完善了。虽然,我确信可能会有较少的原始方法。
public static String[][] load()throws FileNotFoundException, IOException{
copyFile();
//delimiter removes the comma or return to the next line. "\n" new line
Scanner scan = new Scanner(new FileReader(file)).useDelimiter(",|\n");
for(int i = 0; i < 20; ++i){
for(int j = 0; j < 5; ++j){
if(scan.hasNext())
array[i][j] = scan.next().replace(",", "").trim();
}
}
System.out.println("File loaded successfully!!");
scan.close();
return array;}
答案 0 :(得分:0)
这是一个错误,非常微妙的错误:
虽然您有20行和5列,但数组使用基于0的索引(从0开始计数而不是1)。 用你的手指从0到5计数,你会发现实际上有6个数而不是5个,这导致你的OutOfBoundsException,因为你没有第6个元素。 因此,要访问您的行和列,范围应介于: 0 - 19(对于列)和0 - 4(对于行)
或
1 - 20(对于列)和1 - 5(对于行)然后从扫描仪输入中减去1,因为记住数组使用基于0的索引。
更新文件读取:
public static String[][] load() {
try{
FileReader fr = new FileReader("c:/temp/Address.txt");
BufferedReader bf = new BufferedReader(fr);
String presentLine = "";
for(int i = 0; i < 20; i++) {
for(int j = 0; i < 5; j++) {
if ((presentLine = bf.readLine()) != null) {
array[i][j] = presentLine;
}
}
}
} catch(Exception e) {
System.out.println(e);
}
selectMenu();
return array;
}
虽然这可以做得更好但是没关系。 您可以将20和5分别存储为称为行和列的静态变量,以避免使用硬编码数字。