indexOf() 方法在 ArrayList 中找不到我的字符串
indexOf() method can't find my string in ArrayList
我是 Java 的新手,我正在尝试编写一些简单的代码来查找在组合框中选择的对象(溶剂),然后在按下按钮时显示与其关联的数字(移位值)在表单上按下名为 shift 的按钮。
我已将其设置为包含溶剂及其相应位移值的数组。我将组合框对象转换为字符串,将其存储为字符串 'chosen',然后尝试检查此 'chosen' 字符串在数组中的位置。为此,我将数组转换为 ArrayList
并使用 indexOf
.
此代码抛出 ArrayIndexOutOfBoundsException
因为 int 位置总是显示为 -1
,因此当我尝试将显示文本设置为 solvents[position][1]
时显示为 solvents[-1][1]
这是行不通的。
我的问题是为什么会出现 -1?我知道这意味着在列表中找不到字符串,但它应该是。 (即列表应如下所示:CDCl3、H2O ... 等,因此 String
'chosen' 即 "CDCl3"
在该列表中。)
此外,即使这确实有效并且 position = -1
没有出现,我知道我的下一行 textDisplay.setText(solvents[position][1]);
必须修改,因为现在位置指的是一个 ArrayList
,不在数组中。有人有什么想法吗?谢谢。
String[][] solvents = new String[4][2];
String chosen;
public void populate_array() {
solvents[0][0] = "CDCl3";
solvents[1][0] = "H2O";
solvents[2][0] = "CD2Cl2";
solvents[3][0] = "DMSO";
solvents[0][1] = "7.26";
solvents[1][1] = "4.79";
solvents[2][1] = "5.32";
solvents[3][1] = "2.50";
}
public int solvent_position() { // finding where in the array the solvent is
int col_length = solvents[0].length;
int row_length = solvents.length;
int i = 0;
int position = -1;
int j = 0;
populate_array();
for (i = 0; i < row_length; i++) { // go through each row to find the solvent
if (solvents[i][0].contains(chosen)) {
position = Arrays.asList(solvents).indexOf(chosen);
textDisplay.setText(solvents[position][1]); // trying to the display the number associated with the solvent
}
}
return position;
}
private void shift_buttonActionPerformed(java.awt.event.ActionEvent evt) {
chosen = (String) combo_solvent.getSelectedItem();
solvent_position();
}
你现在的逻辑毫无意义。 solvents[i][0].contains(chosen)
将检查 solvents[i]
字符串中数组的第一个元素是否包含 chosen
、"ABC".contains("B")
-> true
,几乎可以肯定这不是你想要的想要。
Arrays.asList(solvents)
将是 String[]
的列表,而不是 String
的列表。这就是为什么 indexOf
永远不会在其中找到 String
的原因。 (一个适当的 IDE 甚至会告诉你)
也就是说:我不知道你想做什么,可能你应该使用 2 个 for 循环进行迭代,删除 contains
和 Arrays.asList
但使用 equals
来比较 Strings
。但是仍然是return类型不清楚,一个int
不足以保存整个索引信息。
您在 Arrays.asList(solvents).indexOf(chosen);
行有问题
您正在尝试将二维数组转换为 List
。在这里,您创建了一个一维数组列表。显然, chosen
是一个字符串而不是数组。因此,由于字符串永远不会在数组列表中,因此您将获得 -1 作为索引。
为了解决您的问题,我建议您使用不同的方法创建一个 class,如下所示:
public class Solvent{
public String name;
public float solubility; // or whatever your number is..
public Solvent(String name, float solubility){
this.name = name;
this.solubility = solubility;
}
}
在你的主要代码中:
List<Solvent> solvents = new ArrayList<Solvent> solvents;
solvents.add(new Solvent("H20", 4.79));
//add others.
现在获取位置:
public int getPosition(String name){
for(Solvent solvent: solvents){
if(name.equals(solvent.name)){
return solvents.indexOf(solvent);
}
}
return -1;
}
我建议您重写代码以使用映射,这将大大简化您的代码,并且您不需要处理所有索引或手动查找所选溶剂。
看来你对shift值感兴趣,而不是具体的位置,获取shift值就像下面的例子一样。
我对这两个值都使用了字符串,但您可以对移位值使用浮点数。
//Create the map with the values
HashMap<String, String> solvents = new HashMap<String, String>();
//Populate the data in your map
solvents.put("CDCl3", "7.26");
solvents.put("H2O", "4.79");
//Obtain the shift value, null if the element wasn't found
String shiftvalue = solvents.get(chosen);
您使用了二维字符串数组,但每个位置只放置了一个字符串。这就是为什么您的数组列表无法捕获数组的值并返回 -1 作为 else 执行的原因。
我是 Java 的新手,我正在尝试编写一些简单的代码来查找在组合框中选择的对象(溶剂),然后在按下按钮时显示与其关联的数字(移位值)在表单上按下名为 shift 的按钮。
我已将其设置为包含溶剂及其相应位移值的数组。我将组合框对象转换为字符串,将其存储为字符串 'chosen',然后尝试检查此 'chosen' 字符串在数组中的位置。为此,我将数组转换为 ArrayList
并使用 indexOf
.
此代码抛出 ArrayIndexOutOfBoundsException
因为 int 位置总是显示为 -1
,因此当我尝试将显示文本设置为 solvents[position][1]
时显示为 solvents[-1][1]
这是行不通的。
我的问题是为什么会出现 -1?我知道这意味着在列表中找不到字符串,但它应该是。 (即列表应如下所示:CDCl3、H2O ... 等,因此 String
'chosen' 即 "CDCl3"
在该列表中。)
此外,即使这确实有效并且 position = -1
没有出现,我知道我的下一行 textDisplay.setText(solvents[position][1]);
必须修改,因为现在位置指的是一个 ArrayList
,不在数组中。有人有什么想法吗?谢谢。
String[][] solvents = new String[4][2];
String chosen;
public void populate_array() {
solvents[0][0] = "CDCl3";
solvents[1][0] = "H2O";
solvents[2][0] = "CD2Cl2";
solvents[3][0] = "DMSO";
solvents[0][1] = "7.26";
solvents[1][1] = "4.79";
solvents[2][1] = "5.32";
solvents[3][1] = "2.50";
}
public int solvent_position() { // finding where in the array the solvent is
int col_length = solvents[0].length;
int row_length = solvents.length;
int i = 0;
int position = -1;
int j = 0;
populate_array();
for (i = 0; i < row_length; i++) { // go through each row to find the solvent
if (solvents[i][0].contains(chosen)) {
position = Arrays.asList(solvents).indexOf(chosen);
textDisplay.setText(solvents[position][1]); // trying to the display the number associated with the solvent
}
}
return position;
}
private void shift_buttonActionPerformed(java.awt.event.ActionEvent evt) {
chosen = (String) combo_solvent.getSelectedItem();
solvent_position();
}
你现在的逻辑毫无意义。 solvents[i][0].contains(chosen)
将检查 solvents[i]
字符串中数组的第一个元素是否包含 chosen
、"ABC".contains("B")
-> true
,几乎可以肯定这不是你想要的想要。
Arrays.asList(solvents)
将是 String[]
的列表,而不是 String
的列表。这就是为什么 indexOf
永远不会在其中找到 String
的原因。 (一个适当的 IDE 甚至会告诉你)
也就是说:我不知道你想做什么,可能你应该使用 2 个 for 循环进行迭代,删除 contains
和 Arrays.asList
但使用 equals
来比较 Strings
。但是仍然是return类型不清楚,一个int
不足以保存整个索引信息。
您在 Arrays.asList(solvents).indexOf(chosen);
您正在尝试将二维数组转换为 List
。在这里,您创建了一个一维数组列表。显然, chosen
是一个字符串而不是数组。因此,由于字符串永远不会在数组列表中,因此您将获得 -1 作为索引。
为了解决您的问题,我建议您使用不同的方法创建一个 class,如下所示:
public class Solvent{
public String name;
public float solubility; // or whatever your number is..
public Solvent(String name, float solubility){
this.name = name;
this.solubility = solubility;
}
}
在你的主要代码中:
List<Solvent> solvents = new ArrayList<Solvent> solvents;
solvents.add(new Solvent("H20", 4.79));
//add others.
现在获取位置:
public int getPosition(String name){
for(Solvent solvent: solvents){
if(name.equals(solvent.name)){
return solvents.indexOf(solvent);
}
}
return -1;
}
我建议您重写代码以使用映射,这将大大简化您的代码,并且您不需要处理所有索引或手动查找所选溶剂。
看来你对shift值感兴趣,而不是具体的位置,获取shift值就像下面的例子一样。
我对这两个值都使用了字符串,但您可以对移位值使用浮点数。
//Create the map with the values
HashMap<String, String> solvents = new HashMap<String, String>();
//Populate the data in your map
solvents.put("CDCl3", "7.26");
solvents.put("H2O", "4.79");
//Obtain the shift value, null if the element wasn't found
String shiftvalue = solvents.get(chosen);
您使用了二维字符串数组,但每个位置只放置了一个字符串。这就是为什么您的数组列表无法捕获数组的值并返回 -1 作为 else 执行的原因。