indexOf()方法在ArrayList

时间:2017-08-27 15:11:56

标签: java arrays loops arraylist indexof

我是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();
}

4 个答案:

答案 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循环进行迭代,删除containsArrays.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执行的原因。