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