Posição inicial em Substring [RESOLVIDO]

Olá pessoal

Preciso de ajuda para trabalhar com uma substring, ao invés de colocar os valores inicial e final gostaria que esses valores fossem passados através de variaveis

Com o código abaixo a string subfrase retorna “minha”.


public class LerSubstring{
 public static void main(String[] args){
    String frase = "Aqui está a minha String";

    String subfrase = frase.substring(12, 17);
    System.out.println(subfrase);

    System.exit(0);
  }
  }

Gostaria que os valores 12 e 17 pudesse ser substituídos por váriaveis, principalmente o valor inicial, pois o valor final eu obtenho com o indexOf().

Por exemplo:


public class LerSubstring{
 public static void main(String[] args){
    String frase = "Aqui está a minha String";

    String subfrase = frase.substring(12, frase.indexOf(" "));
    System.out.println(subfrase);

    System.exit(0);
  }
  }

Meu problema mesmo é atribuir uma variável para o valor inicial. Alguém pode me ajudar?[size=18] [/size]

Obrigado

Oi,

Pq vc não utiliza o indexOf para o inicial?

Ou então, crie um método que recebe uma String e busque essa palavra dentro de sua frase. (Mais elegante)

Tchauzin!

Olá lina

Pois é, no exemplo que eu passei antes funciona mas no exemplo que eu preciso mesmo ele me retorna um erro.

Este é o meu código


import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class LerSubstring {

    public static void main(String[] args) {
        String novodoc = "";

        try {
            File arquivo = new File("alt_Celera_chr222.gbk");   //Localiza o arquivo
            FileInputStream in = new FileInputStream(arquivo);
            Scanner scanner = new Scanner(in);

            //Enquanto houver um proximo caracter a variavel recebe o scanner
            while (scanner.hasNext()) {
                String readLine = scanner.next();
                novodoc = (novodoc + readLine.substring(0));// variavel recebe as sequencias do documento
            }
        } catch (Exception e) {
            System.out.println("Ocorreu algum erro. Erro: " + e);
        }

        String frase = "Aqui está a minha String";
        String index = JOptionPane.showInputDialog("Informe o INDEX inicial: ");

        String subfrase = novodoc.substring(novodoc.indexOf(index), novodoc.indexOf("//"));
        System.out.println(subfrase);

        System.exit(0);
    }
}

Será que é algum problema com a minha String “novodoc”?
Essa pesquisa é o princípio de outras que vou precisar fazer.

Agradeço muito se puder postar algum exemplo que funcione.

O método indexOf retorna o índice da primeira ocorrência do termo passado por parâmetro. E se o termo não for encontrado, o retorno é -1.

[code]String index = JOptionPane.showInputDialog("Informe o INDEX inicial: ");

String subfrase = novodoc.substring(novodoc.indexOf(index), novodoc.indexOf("//"));[/code]Neste caso, se o conteúdo de index não for encontrado em novodoc, será passado -1 para o método substring, o que irá ocasionar uma exceção. Ocorrerá o mesmo se “//” não for encontrado.

Se a intenção é receber o índice inicial pelo inputDialog, seria melhor convertê-lo para int.

[code]int index = Integer.parseInt(JOptionPane.showInputDialog("Informe o INDEX inicial: "));

String subfrase = novodoc.substring(index, novodoc.indexOf("//"));[/code]Poderia também postar a exceção que está ocorrendo?

Desculpe se não consegui ser muito claro.

E só por curiosidade:

//Enquanto houver um proximo caracter a variavel recebe o scanner while (scanner.hasNext()) { String readLine = scanner.next(); novodoc = (novodoc + readLine.substring(0));// variavel recebe as sequencias do documento }Este trecho está eliminando os espaços?

Falou…

Olá Eric

Quanto a sua curiosidade o trecho abaixo retorna uma string sem espaços, fica tudo numa linha só.

 //Enquanto houver um proximo caracter a variavel recebe o scanner  
 while (scanner.hasNext()) {  
     String readLine = scanner.next();  
     novodoc = (novodoc + readLine.substring(0));// variavel recebe as sequencias do documento  
 }  

Conforme você sugeriu converti a variável para integer e ficou assim:

import java.io.File;
import java.io.FileInputStream;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class LerSubstring {

    public static void main(String[] args) {
        String novodoc = "";

        try {
            File arquivo = new File("alt_Celera_chr222.gbk");   //Localiza o arquivo
            FileInputStream in = new FileInputStream(arquivo);
            Scanner scanner = new Scanner(in);

            //Enquanto houver um proximo caracter a variavel recebe o scanner
            while (scanner.hasNext()) {
                String readLine = scanner.next();
                novodoc = (novodoc + readLine.substring(0));// variavel recebe as sequencias do documento
            }
        } catch (Exception e) {
            System.out.println("Ocorreu algum erro. Erro: " + e);
        }
        System.out.println(novodoc);
        
        
        
        String locus = "LOCUS" + JOptionPane.showInputDialog("Informe o LOCUS: ");   //Variavel recebe o valor do LOCUS
        int index = novodoc.lastIndexOf(locus);  //Variavel int que vai receber a posição do locus


        String subfrase = novodoc.substring(index, novodoc.indexOf("//"));
        System.out.println(subfrase);

        System.exit(0);
    }
}

Foi por falta de conhecimento mesmo, o index final estava retornando um valor menor que o index inicial, existem várias ocorrências de “//”, como o indexOf() pega a primeira ocorrência estava dando erro.

Antes de dar o post como RESOLVIDO, tenho mais uma pergunta: Tem como resolver o problema deste indice final? Será que dentro de um if percorrendo a string e verificando se a posição atual é maior que o indice, daí sim começar o processo de substring?

Obrigado a todos pela ajuda.

[quote=asandro1501]Antes de dar o post como RESOLVIDO, tenho mais uma pergunta: Tem como resolver o problema deste indice final? Será que dentro de um if percorrendo a string e verificando se a posição atual é maior que o indice, daí sim começar o processo de substring?[/quote]Tem o método “indexOf(String str, int fromIndex)”, no parâmetro “fromIndex”, você informa a partir de qual índice ele deve começar a procurar pela ocorrência.

String subfrase = novodoc.substring(index, novodoc.indexOf("//", index));Assim o índexOf deve procurar pela primeira ocorrência após o inicial do substring.

Quanto a parte de tirar os espaços, dá pra fazer linha por linha:

//Enquanto houver um proximo caracter a variavel recebe o scanner while (scanner.hasNextLine()) { String readLine = scanner.nextLine().replaceAll(" ", ""); //Este replaceAll troca os espaços por uma String vazia. novodoc += readLine; }Não sei se melhora o desempenho porque eu não sei como trabalha o método replaceAll, mas isso deve diminuir os loops do seu código.

show de bola,

funcionou

Obrigado