大家好,所以我有一个列表,看起来像这个屏幕截图
基本上,我试图接受用户输入的日期,一旦搜索到日期,我就想打印出它旁边的数字。问题是,我的ArrayList无法在不输入整行而不仅仅是日期的情况下使用contain((方法进行搜索。
public class SPX {
public static void main(String[] args) throws IOException {
ArrayList<String> dates = new ArrayList<>();
BufferedReader read = null;
try {
read = new BufferedReader(new FileReader("C:\Users\rosha\eclipse-workspace\working\src\workingFix\spx_data_five_years (1).txt"));
String str;
//reading to the ArrayList
while ((str = read.readLine()) != null) {
String[] lineValues = str.split(str, 1);
dates.add(lineValues[0]);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (read != null) {
try {
read.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//printing out the list
for (String dList:dates) {
System.out.println(dList);
}
findIndex(dates);
}
public static void findIndex(ArrayList<String> dates) {
Scanner sr = new Scanner(System.in);
System.out.println("please enter a date: ");
String userDate = sr.nextLine();
sr.close();
if (dates.contains(userDate)) {
System.out.print("Spx Index: " + userDate);
}
else {
System.out.print("Not found");
}
}
}
11/25/2014 2067.03
11/26/2014 2072.83
11/28/2014 2067.56
12/1/2014 2053.44
12/2/2014 2066.55
12/3/2014 2074.33
12/4/2014 2071.92
12/5/2014 2075.37
12/8/2014 2060.31
12/9/2014 2059.82
12/10/2014 2026.14
这些数字是文本文件的一段,图片显示了它的格式。如果给定某个日期,我想打印出它旁边的值。我很想了解如何实现这一点。如有任何帮助,我们将不胜感激。
您找不到任何东西的原因是因为您使用了ArrayList
的contains
-方法。如果整个String匹配,则此方法仅返回true
。如果我理解正确,您需要在列表的每个字符串中进行搜索。
这样做的一种可能性是使用流。请参阅下面的示例。
public static void findIndex(ArrayList<String> dates) {
Scanner sr = new Scanner(System.in);
System.out.println("please enter a date: ");
String userDate = sr.nextLine();
sr.close();
String foundString = dates.stream().filter(date -> date.contains(userDate)).findFirst().orElse(null);
if (foundString == null) {
System.out.print("Not found");
} else {
System.out.print(foundString.substring(userDate.length()).trim());
}
}
另一种方法是使用问题注释中提到的Map<String, String>
。在这里,输入由空格分隔,行的第一部分是映射的键,第二部分是值。
在您问题的示例代码中,您调用的split
-方法是不必要的,您也可以将str
添加到您的ArrayList中。因此,我可能你的方法导致了这样的事情:
public class SPX {
public static void main(String[] args) throws IOException {
Map<String, String> dates = new HashMap<>();
BufferedReader read = null;
try {
read = new BufferedReader(new FileReader("C:\Users\rosha\eclipse-workspace\working\src\workingFix\spx_data_five_years (1).txt"));
String str;
//reading to the ArrayList
while ((str = read.readLine()) != null) {
String[] lineValues = str.split(" ", 2);
dates.put(lineValues[0], lineValues[1]);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (read != null) {
try {
read.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//printing out the list
for (String dList:dates.keySet()) {
System.out.println(dList);
}
findIndex(dates);
}
public static void findIndex(Map<String, String> dates) {
Scanner sr = new Scanner(System.in);
System.out.println("please enter a date: ");
String userDate = sr.nextLine();
sr.close();
String foundString = dates.get(userDate);
if (foundString == null) {
System.out.print("Not found");
} else {
System.out.print(foundString);
}
}
}