2017-10-07 5 views
-1

J'ai un fichier texte qui ressemble à ceci:Comment afficher 3 dernières et prochaines lignes de la ligne spécifique dans un fichier

technology 
education 
medicine 
women 
architecture 
programming 
reading 
coffee 
dog 
cat 
bird 

je dois rechercher un mot spécifique dans ce fichier (par exemple ' architecture ') et obtenir les trois lignes précédentes et les trois lignes suivantes. Dans le fichier ci-dessus, le résultat serait «Médecines de l'éducation» pour les trois lignes précédentes et le «programme de lecture du café» pour les trois lignes suivantes.

Je suis capable d'obtenir les trois lignes suivantes, cependant, je ne suis pas capable de comprendre comment obtenir les trois lignes précédentes en Java. Pourriez-vous s'il vous plaît m'aider avec cela? Voilà ce que j'ai jusqu'à présent:

Scanner in = new Scanner(new File(filename)); 
     while (in.hasNextLine()){ 
      String str = in.nextLine(); 
      if (str.indexOf("architecture") !=-1){ 
      //this is where I need the code for getting the previous three 
      //lines to go 

      } 
     } 
+0

et si le mot est 'technology' ou' bird'? – Ravi

+0

@Ravi J'ai seulement besoin de trouver «architecture» et les trois mots précédents et les trois prochains mots. – user3602426

Répondre

0

Si vous voulez mot avant et après architecture, puis l'une des solutions possibles est de stocker tout mot dans List et obtenir l'indice de architecture et obtenir -3 et +3.

List<String> lst = new LinkedList<>(); 
    int indx =0; 
    int count =0; 
    Scanner in = new Scanner(new File(filename)); 
     while (in.hasNextLine()){ 
      String str = in.nextLine(); 
      lst.add(str); 
      if (str.indexOf("architecture") !=-1){ 
      indx=count;// get the index. 
      } 
     count++; 
     } 

Maintenant, les récupérer:

//to avoid accessing out of bound index 
int max = (indx+3) >= count ? count -1 : (indx+3);//maximum index should be T-1. 
indx = (indx - 3) < 0 ? 0 : (indx - 3); // minimum index should be 0. 

for(;indx <= max;indx++) 
{ 
    System.out.println(lst.get(indx)); 
} 

>>>Demo<<<

+0

@ utilisateur3602426. Juste oublier de vous dire que c'est flexible pour n'importe quel mot. Ne pas oublier de lever les pouces;) – Ravi

0
  • Lire toutes les lignes du fichier et de les stocker dans une liste
  • Trouvez l'index de la chaîne que vous recherchez.
  • Imprimez les chaînes aux indices requis.

    List<String> lines = Files.readAllLines(Paths.get(filename)); 
    int index = lines.indexOf("architect"); 
    String finalString = lines.get(index-3) + " " + lines.get(index-2) + " " + lines.get(index-1) + " " + lines.get(index+1) + " " + lines.get(index+2) + " " + lines.get(index+3); 
    
+0

cela peut entraîner un index hors limite, si index est au début ou à la fin. – Ravi

+0

@Ravi, l'OP doit le gérer. Il devra également gérer les exceptions. Je peux donner aussi ce détail s'il en a besoin. – VHS

0

Gardez les 3 lignes précédentes. Voici un algorithme round robin: un tableau où l'élément le plus ancien est écrasé.

String[] previousLines = new String[3]; 
int previousWritePos = 0; 
int previousCount = 0; 

Scanner in = new Scanner(new File(filename)); 
while (in.hasNextLine()){ 
    String str = in.nextLine(); 
    if (str.indexOf("architecture") !=-1){ 
      //this is where I need the code for getting the previous three 
      //lines to go 
    } 

    // Remember this line as previous line: 
    previousLines[previousWritePos] = str; 
    if (previousCount < 3) { 
     ++previousCount; 
    } 
    previousWritePos = (previousWritePos + 1) % 3; 
} 

for (int i = 0 ; i < previousCount; ++i) { 
    int index = (previousWritePos + 2 - i) % 3; 
    System.out.println("Previous: " + previousLines[index]; 
}