java - 迭代器没有全部设置好

标签 java iterator set

我试图用迭代器搜索一个集合,但是当我这样做时,它只找到整个集合中的两个!,这是我的代码:

import java.net.URL;
import com.google.gson.Gson;
import java.net.URLEncoder;
import java.io.InputStreamReader;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class Main {

  public static int min(int a,int b) {
    return a > b? b : a;
  }

  public static String corregir(String a,Set<String> col) {
      System.out.print("EL TAMAÑO ES: " + col.size());
      Iterator<String> it = col.iterator();
      String resp = a,aux = resp;
      int min = 30,dis,cont = 0;
      while(it.hasNext()) {
          cont++;
          resp = it.next().toString();
          System.out.print("El contador va en "  + cont + "\n");
          dis = edit_distance(a,resp);
          if(dis<min) {
              aux = resp; min = dis;
          }
          if(min==0) return resp;
      }
      return aux;
  }
  public static int edit_distance(String a,String b) {
    int n = a.length(), m = b.length(),costo;
    int[][] mat = new int[n+1][m+1];
    for(int i=0;i<=n;++i) mat[i][0] = i;
    for(int j=0;j<=m;++j) mat[0][j] = j;

    for(int i=1;i<=n;++i) {
      for(int j=1;j<=m;++j) {
        costo = a.charAt(i-1) == b.charAt(j-1)? 1 : 0;
        mat[i][j] = min(min(mat[i-1][j] + 1,mat[i-1][j-1] + costo),mat[i][j-1] + 1);
      }
    }

    return mat[n][m];
  }

  public static String resultados_de_la_busqueda(String search) {
    StringBuffer RES = new StringBuffer("<html>");
    String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="; //El enlace para buscar en google
    String charset = "UTF-8";
    URL url;
    Reader reader;
    try {
      url = new URL(google + URLEncoder.encode(search, charset));
      try {
        reader = new InputStreamReader(url.openStream(), charset);
        GoogleResults results = new Gson().fromJson(reader, GoogleResults.class);
        for(int i=0;i<3;++i) {
          RES.append(results.getResponseData().getResults().get(i).getTitle());
          RES.append("<br/>");
          RES.append("<a href=\"");
          RES.append(results.getResponseData().getResults().get(i).getUrl());
          RES.append("\">" + results.getResponseData().getResults().get(i).getUrl() + "</a>");
          RES.append("<br/><br/>");
        }
      } catch(Exception e) {}
    } catch(Exception e) {}

    RES.append("</html>");
    return RES.toString();
  }

  public static void main(String[] args) throws Exception {
    Set<String> col = new HashSet<String>();
    FileInputStream fis = new FileInputStream("lemario.txt");
    Scanner cin = new Scanner(fis);

    while(cin.hasNext()) {
        col.add(cin.next());
    }
    cin.close();

    final Set<String> col2 = col;
    /*
    Iterator<String> it = col2.iterator();

    while(it.hasNext()) {
        System.out.print(it.next() + "\n");
    }*/
    //Corrector
    System.out.print(col.size());
    //Map<String,>
    JFrame jf = new JFrame("Programa");
    jf.setBounds(120,120,500,500);
    jf.setResizable(false);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final JTextField input = new JTextField();
    input.setBounds(25,25,300,25);

    final JLabel resultados = new JLabel();
    resultados.setBounds(120,120,200,200);

    JButton boton = new JButton("Buscar");
    ActionListener al = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        if(! input.getText().equals("")) {
            String entrada = input.getText();
            entrada = corregir(entrada,col2);
            resultados.setText(resultados_de_la_busqueda(entrada));
        }
        else System.out.println("No hay entrada\n");
      }
    };
    boton.addActionListener(al);
    input.addActionListener(al);
    boton.setBounds(350,25,130,25);

    jf.add(boton);
    jf.add(input);
    jf.add(resultados);


    //resultados.setText(resultados_de_la_busqueda("taringa")); //setText(input.getText()); asumiendo que está bien escrito.
    //Para verificar si está bien escrito tenemos que pasarlo por el diccionario y verificar palabra por palabra
    //Bastante lento, pero qué se va a hacer :'D
    jf.add(input);
    jf.add(resultados);
    jf.setVisible(true);
  }
}

我正在阅读的文件是这样的:http://www.teoruiz.com/lemario/lemario-20101017.txt 知道我做错了什么吗?

最佳答案

线路

if(min==0) return resp;

...in 循环将在迭代器遍历集合中的所有元素之前提前终止循环。因此,如果 edit_distance 返回 0,它将停止循环(并跳出函数,返回 resp)。

关于java - 迭代器没有全部设置好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11545931/

相关文章:

Rust String 与 &str 迭代器

c++ - 在 C++11 基于范围的 'for' 循环中获取对 STL 容器元素的引用

Python 将列表转换为集合,大 O

MYSQL - 更新 SET 值

c++ - 如何创建迭代器来解决这个问题?

java - 处理仅对层次结构的一部分有意义的二元运算

java - Intellij IDEA 中的汉字——如何显示?

c++ - 使用迭代器进行二分搜索

java - 如何使用 apache.commons 中的 CSVParser 以任意顺序读取 CSV 列

java - Eclipse如何直接显示可用函数列表