如何比较字符串以获得遗漏的单词?

时间:2012-07-20 20:14:23

标签: java string jtable

我创建了一个表和一些删除/添加行的按钮。 问题是,当我添加一个新行时,我必须在字段名称中插入一个值,该值不在该表中。让我解释一下。

这是默认表:

11

现在假设我删除了第3站:

22

如果我添加一个新的电台,我想添加一个新的电台名称Station 3(列表中缺少)但我添加了一个新的电台5(显然我的代码不正确)。

33

我的添加按钮操作事件的代码是这样的:

private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {                                          
    DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
    String s2 = "";
    String s1 = "Station 1 Station 2 Station 3 Station 4 Station 5";
    int tb1rows = jTable1.getRowCount();
    if (tb1rows == 5) {
        // ERROR - MAXIMUM STATION NUMBER
    }
    else {
        for (int i=0; i<tb1rows;i++) {
            s2.concat(jTable1.getValueAt(i,1).toString());
            s2.concat(" ");
         }
        String[] s3=s2.split(" ");
        for (int i=0;i<s3.length;i++) {
            if (s1.contains(s3[i])) {
                System.err.println("contains");
                System.out.println(s3[i]);
            }
        }
        model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (jTable1.getRowCount()+1),10,false,0,Color.BLACK});
    }
}

我的逻辑出了什么问题?有没有更好的方法来处理问题,以便我可以获得该列中缺少的“Station x”,以便我可以重新添加它?

提前感谢您的回答。

6 个答案:

答案 0 :(得分:2)

只要你有

"Station " + (jTable1.getRowCount()+1)

新电台总是被命名为#34;电台N + 1&#34;。

假设您解决了在另一个答案所描述的空间上拆分的问题,那么您的代码应该类似于

 for (int i=0;i<s3.length;i++) {
            if (s1.contains(s3[i])) {
                System.err.println("contains");
                System.out.println(s3[i]);
            }
            else {
 model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (i + 1)      ,10,false,0,Color.BLACK});
}

    }

答案 1 :(得分:2)

由于“Station 1”中有空格,因此空间拆分不行。而是使用其他分隔符,例如“;”,最好使用Set<String> values = new HashSet<String>()

答案 2 :(得分:1)

如果它有序,你可以找到第一个间隙并插入那里。所以迭代行,如果nextrow.numberInIt > thisrow+1插入thisrow+1


代码应该是这样的:

int nextNrToInsert;

for(int=0; i < tb1rows; i++){
    thisrowNr = jTable1.getValueAt(i,1).toString();
    NextrowNr = jTable1.getValueAt(i+1,1).toString();

    if(nextrowNr > thisrowNr+1){
      //found the gap
      nextNrToInsert = thisrowNr+1;
      break;
    }
}
//change this to use nextNrToInsert
model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (jTable1.getRowCount()+1),10,false,0,Color.BLACK});

答案 3 :(得分:1)

而不是所有字符串操作,您可以使用set mainpulations:

HashSet<String> all = new HashSet<String>();
// then populate all with your 5 station strings (loop)
HashSet<String> have = new HashSet<String>();
// then populate all with the contents of your table (loop)
all.removeAll(have);
// all now contains the ones that weren't in the table.

答案 4 :(得分:0)

这一行是问题

model.insertRow(jTable1.getRowCount(),new Object[] {jTable1.getRowCount() + 1,"Station " + (jTable1.getRowCount()+1),10,false,0,Color.BLACK});

您总是在rowCount() + 1的行中添加。因此,即使您删除了Station 3,也有4行,并且您要添加行+ 1。

答案 5 :(得分:0)

此代码无效:

    for (int i=0; i<tb1rows;i++) {
        s2.concat(jTable1.getValueAt(i,1).toString());
        s2.concat(" ");
     }

在循环退出时,s2仍然是一个空字符串,因此s3将是一个空数组。

但是,无论如何,连接字符串然后拆分它们的方法是错误的。如果你需要的只是找到最小的整数,附加到“Station”将产生一个唯一的字符串,最自然的方法是使你自己的TableModel使用你自己的对象列表行的数据。在该数据中,您将保留整数本身,而不是整个字符串“Station n ”。然后在整数列表中找到一个漏洞将是一件微不足道的事。