我最近又重新开始编程,并决定将Java作为我的第一门主要语言。在我开始深入研究文件保存之前,我没有遇到任何重大问题。我几乎采用了我遇到的第一种方法;输入和输出流。我遇到的问题是在“analyzeIncidents”方法中。如果不存在用户数据,则该方法正常运行,我得到预期的输出。如果用户数据存在,则“analyzeIncidents”中的第一个if ... then语句将运行,但它永远不会发现条件语句为真。但是,一旦我删除了UserData.sav文件,一切都会再次运行。我花了几个小时检查程序所有阶段的输出,但到目前为止,没有理由说if ... then语句在使用加载数据时失败但是否则成功。我还尝试保存,然后在它被扔到“analyzeIncidents”之前加载数据,它在第一次运行时起作用,但在之后的任何尝试都失败了。希望你们能指出我确信这是我的一个明显错误。
MAIN:
import java.io.*;
import java.util.*;
public class nutralyzeApp {
static Scanner userInput = new Scanner(System.in);
public static void main(String[] args) {
int elements = 0;
int selectedElement = 0;
int[][] incidentAnalysis = new int[2][50];
String newElement = "999";
String[][] data2012 = new String[366][51];
//Checks to see if previous save file exists. If not, creates new save file.
File f = new File("C:/Users/Liam/Dropbox/Workspace/Nutralyze/UserData.sav");
if(f.exists()) {
System.out.println("Previous work session loaded.");
data2012 = loadData();
} else {
data2012[0][0] = "granola";
data2012[0][1] = "gluten";
data2012[0][2] = "sugar";
data2012[0][3] = "beef";
data2012[1][0] = "dairy";
data2012[8][0] = "cheese";
data2012[59][0] = "pizza";
data2012[59][1] = "chips";
data2012[206][0] = "beer";
data2012[206][1] = "cheese";
data2012[8][50] = "incident";
data2012[59][50] = "incident";
data2012[85][50] = "incident";
data2012[190][50] = "incident";
data2012[206][50] = "incident";
saveData(data2012);
}
System.out.println("What day is it? ");
int currentDay = userInput.nextInt();
elements = numberOfElements(currentDay,data2012);
System.out.println("Elements consumed that day: " + elements);
System.out.println("What element would you like to add?");
newElement = userInput.next();
while (!newElement.equals("49")) {
data2012 = addElement(currentDay,elements,newElement,data2012);
elements = numberOfElements(currentDay,data2012);
System.out.println("What element would you like to add?");
newElement = userInput.next();
}
System.out.print("Which element would you like to see? ");
selectedElement = userInput.nextInt();
while (selectedElement != 49) {
System.out.println("The element you selected is: " + data2012[currentDay][selectedElement]);
System.out.println("You typed: " + selectedElement);
System.out.print("Which element would you like to see? ");
selectedElement = userInput.nextInt();
}
data2012 = gatherElements(data2012);
incidentAnalysis = analyzeIncidents(data2012);
for (int x=0;x<10;x++) {
System.out.print(data2012[365][x] + " --> " + incidentAnalysis[0][x] + "/" + incidentAnalysis[1][x]+ "\n");
}
//Resets data and saves to file.
for (int x=0;x<50;x++) {
data2012[365][x] = null;
}
saveData(data2012);
}
方法:
private static int[][] analyzeIncidents(String[][] userData) {
boolean found = false;
int elements1 = 0;
int elements2 = 0;
int incidentCounter = 0;
int currentIncident = 0;
int[] incidentDates = new int[365];
int[][] incidentReport = new int[2][50];
for (int x=0;x<365;x++) {
if (userData[x][50]=="incident") {
incidentDates[incidentCounter]=x;
incidentCounter++;
System.out.println(userData[x][50]);
}
}
System.out.println(incidentCounter + " " + userData[8][50]);
elements1 = numberOfElements(365,userData);
for (int x=0;x<elements1;x++) {
for (int y=0;y<incidentCounter;y++) {
currentIncident = incidentDates[y];
elements2 = numberOfElements(currentIncident,userData);
for (int z=0;z<elements2;z++) {
if ((userData[365][x]==userData[currentIncident][z]) && (found==false)) {
incidentReport[0][x]++;
incidentReport[1][x]++;
} else if ((userData[365][x]==userData[currentIncident][z]) && (found==true)) {
incidentReport[1][x]++;
}
}
}
}
return incidentReport;
}
private static String[][] gatherElements(String[][] userData) {
int z = 0;
int elements = 0;
int uniqueElements = 0;
boolean found = false;
for (int x=0;x<50;x++) {
userData[365][x] = null;
}
//userData[365][0] = userData[0][0];
for (int x=0;x<365;x++) {
elements = numberOfElements(x,userData);
for (int y=0;y<elements;y++) {
while (z<50) {
if (userData[365][z]!=userData[x][y]) {
z++;
found=false;
} else if (userData[365][z]==userData[x][y]) {
z=50;
found=true;
break;
}
}
z=0;
if (found==false) {
userData[365][uniqueElements] = userData[x][y];
uniqueElements++;
}
}
}
return userData;
}
private static String[][] addElement(int day,int position,String newElement,String[][] userData) {
userData[day][position] = newElement;
return userData;
}
private static int numberOfElements(int day, String[][] userData) {
int x = 0;
while (userData[day][x] != null && x < 365) {
x++;
}
return x;
}
private static void saveData(String[][] data2012) {
try{
// Open a file to write to, named UserData.sav
FileOutputStream saveFile = new FileOutputStream("UserData.sav");
// Create an ObjectOutputStream to put objects into save file
ObjectOutputStream save = new ObjectOutputStream(saveFile);
// Now we do the save
save.writeObject(data2012);
// Close the file
save.close(); // This also closes saveFile
}
catch(Exception exc){
exc.printStackTrace(); // If there was an error, print the info
}
}
private static String[][] loadData() {
String[][] userData = new String[366][51];
try{
// Open file to read from, named UserData.sav
FileInputStream saveFile = new FileInputStream("UserData.sav");
// Create an ObjectInputStream to get objects from save file
ObjectInputStream save = new ObjectInputStream(saveFile);
// Now we do the restore
// readObject() returns a generic Object, we cast those back
// into their original class type
// For primitive types, use the corresponding reference class
userData = (String[][]) save.readObject();
// Close the file
save.close(); // This also closes saveFile
}
catch(Exception exc){
exc.printStackTrace(); // If there was an error, print the info
}
return userData;
}
}
答案 0 :(得分:2)
您正在通过引用来比较字符串,而不是语义相等。这样:
if (userData[x][50]=="incident")
应该是:
if (userData[x][50].equals("incident"))
或者如果您想继续,即使userData[x][50]
为空:
if ("incident".equals(userData[x][50]))
你也在其他地方做同样的事情:
if (userData[365][z]!=userData[x][y]) {
...
} else if (userData[365][z]==userData[x][y]) {
}
这应该是:
if (!userData[365][z].equals(userData[x][y])) {
...
} else {
}
(你不需要第二个条件,因为它与第一个条件完全相反。)