我是Java的新手,我正在尝试编写一些简单的代码,找到在组合框中选择的对象(溶剂),然后在按下名为shift的按钮时显示与之关联的数字(移位值)形式。
我已将其设置为具有溶剂及其相应移位值的数组。我将组合框对象转换为String,将其存储为字符串'selected',然后尝试检查在数组中找到这个'selected'字符串的位置。为此,我将数组转换为ArrayList
并使用indexOf
。
此代码会抛出ArrayIndexOutOfBoundsException
,因为int位置始终为-1
,所以当我尝试将显示文本设置为solvents[position][1]
时,它会显示为solvents[-1][1]
这不起作用。
我的问题是-1为什么会出现?我知道这意味着在列表中找不到String,但它应该是。 (即列表应该是这样的:CDCl3,H2O ......等等,因此String
'选择'的是"CDCl3"
在该列表中。)
此外,即使这确实有效并且position = -1
没有出现,我也知道我的下一行textDisplay.setText(solvents[position][1]);
必须被修改,因为现在该位置指的是ArrayList
中的位置{1}},不在数组中。有没有人有任何想法?感谢。
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();
}
答案 0 :(得分:3)
我建议你重写代码以使用地图,这将大大简化你的代码,你不需要处理所有索引或手动寻找所选的溶剂。
您似乎对移位值感兴趣,而不是在特定位置,以获得移位值,就像在下面的示例中那样。
我正在为两个值使用字符串,但你可以使用浮点值作为移位值。
//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 :(得分:0)
你当前的逻辑毫无意义。 solvents[i][0].contains(chosen)
会检查solvents[i]
字符串中数组的第一个元素是否包含chosen
,"ABC".contains("B")
- &gt; true
,几乎可以肯定这不是你想要的。
Arrays.asList(solvents)
将是String[]
的列表,而不是String
的列表。这就是indexOf
永远不会在其中找到String
的原因。 (一个合适的IDE甚至会告诉你)
话虽如此:我不知道你要做什么,可能你应该使用2个for循环进行迭代,删除contains
和Arrays.asList
但是使用{ {1}}比较equals
。但仍然不清楚返回类型,Strings
不足以保存整个索引信息。
答案 2 :(得分:0)
您在Arrays.asList(solvents).indexOf(chosen);
您正在尝试将二维数组转换为List
。在这里,您创建了一维数组的列表。显然,chosen
是一个字符串而不是一个数组。因此,由于字符串永远不会位于数组列表中,因此您将获得-1作为索引。
为了解决您的问题,我建议您通过创建一个类来使用不同的方法:
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;
}
答案 3 :(得分:0)
您使用了二维字符串数组,但每个位置只放置一个字符串。这就是为什么你的数组列表无法捕获数组的值并返回-1作为else执行的原因。