Професионална програма
Loading...
+ Нов въпрос
Nani15 avatar Nani15 12 Точки

Problem 2. Count Substring Occurrences - Java - Text Processing and Regex API

import jdk.nashorn.internal.runtime.regexp.joni.Regex;

import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by User on 5.4.2016 г..
 */
public class Pr2_Count {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        String text = scanner.nextLine().toLowerCase();
        String word = scanner.nextLine().toLowerCase();

        int counter = 0;
        Pattern pattern = Pattern.compile(word);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            counter++;
        }
        System.out.println(counter);
    }
}

Здравейте имам следния проблем със задача 2 от домашното по Джава "Text Processing and Regex API"

Write a program to find how many times given string appears in given text as substring. The text is given at the first input line. The search string is given at the second input line. The output is an integer number. Please ignore the character casing. 

Това е условието. Ясно ми е защо не ми се получава, a именоо защото, след като намери групата то продължава със стринга без да взима следващите букви като така губя възможности. Знам какъв е но нямам представа как да го оправя. Много ще се радвам ако ми помогнете. :))

 

Тагове:
0
Java Advanced
Nani15 avatar Nani15 12 Точки
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by User on 5.4.2016 г..
 */
public class Pr3_Specific {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String text = scanner.nextLine().toLowerCase();

        String word = scanner.nextLine().toLowerCase();

        Pattern pattern = Pattern.compile(word);
        int counter = 0;
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            counter++;
        }
        System.out.println(counter);
    }
}

С трета също имам проблем. Решаването е горе долу същото като втора, но пак не ми се получва. 

Третият пример е следният.

"It's OK, I'm in." + "i"

Тук мойта програмка чете всички "i"та вместо да чете само отделните думи които са "I". Ще се радвам ако помогнете :)

0
vani4ka66 avatar vani4ka66 24 Точки

Аз трета съм я направила по следния начин - 

        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine().toLowerCase();
        String command = scan.nextLine().toLowerCase();
        String[] integers = input.split("\\W+");
        int count = 0;

        for (int i = 0; i < integers.length; i++) {
            if (integers[i].equals(command)){
                count++;
            }
        }
        System.out.println(count);
    }

 



 

1
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки

Здравей,

Помисли над моя Regex :) 

Pattern pat = Pattern.compile("\\b" + specWord + "(?=[[:punct:]]?)\\b", Pattern.CASE_INSENSITIVE);

А относно каунта на думи, имаше интересна тема във форума и се заформи една дискусия с RoYaL ... там е отговора на въпроса ти :)

Успех

2
05/04/2016 22:13:27
vani4ka66 avatar vani4ka66 24 Точки

Погледни и решението на втора задача без патерни  - 

        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine().toLowerCase();
        String command = scan.nextLine().toLowerCase();

       
        int count = 0;

        for (int i = 0; i <= input.length() - command.length(); i++) {

            if (input.substring(i, command.length() + i).equals(command)){
                count++;
            }
        }
        System.out.println(count);
    }


 

3
CvetanPetkov avatar CvetanPetkov 47 Точки

Ами търси с "indexOf(substring)". После използвай "while" цикъл. Ето моето решение: 

https://gist.github.com/CvetanPetkov/1fde2f6b86bb08fdef7115bf1b3af8b6

0
svetlyoek avatar svetlyoek 20 Точки

Здравейте.Бихте ли обяснили как точно работи логиката и кода?

@CvetanPetkov

0
Shirdor avatar Shirdor 130 Точки
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
String targetWord = scan.nextLine();
Pattern pattern = Pattern.compile("\\w+");
Matcher matcher = pattern.matcher(input);
Boolean found = matcher.find();
int count = 0;
while (found == true){
   if(matcher.group().toLowerCase().equals(targetWord.toLowerCase())){
       count++;
   }
    found = matcher.find();
}
System.out.println(count);

това работи за 3-та задача

 

0
tishkata86 avatar tishkata86 14 Точки

Здравей и аз имах този проблем че минава към следващата дума и успях да докатам отговора с lookahead като по този начин регекса взима само 1 буква и минава на следващата и гледа след нея дали няма други.

Ето го и моя код и работи http://pastebin.com/mkG33u3n. Дано да съм помонал.

 

0
ionkoto avatar ionkoto 23 Точки

Ето аз какво измъдрих за втора, но без Pattern и Matcher:

public class CountSubstringOccurrences {
    public static void main(String[] args) {      

        Scanner console = new Scanner(System.in);
        String text = console.nextLine().toLowerCase();
        String searchStr = console.nextLine().toLowerCase();

        int count = 0;
        int i = 0;
        
        while (text.indexOf(searchStr, i) != -1) {
            count++;
            i = text.indexOf(searchStr,i) + 1;
        }

        System.out.println(count);
    }
}

Ето и трета, още по-простичка: 

import java.util.Scanner;

public class CountSpecifiedWord {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        String[] text = console.nextLine().toLowerCase().split("[\\W]+");
        String target = console.nextLine().toLowerCase();
        int count = 0;
        for (String s : text) {
            if (s.equals(target)){
                count++;
            }
        }
        System.out.println(count);
    }
}

Със split отделям думите в текста и после броя колко пъти търсената дума съвпада с тези в текста.

0
EyubDjelil avatar EyubDjelil 9 Точки

Тъкмо свърших втора задача. Не съм работил с Pattern така,че решението е без него.

public class CountSubstringOccurrences {
    public static void main(String[] args) {
        Scanner scr = new Scanner(System.in);
        //trim can be unused depend of input
        String input = scr.nextLine().trim().toLowerCase();
        String sub = scr.nextLine().trim().toLowerCase();
        scr.close();
        int ocurences = 0;
        for (int i = 0; i < (input.length()-sub.length()+1); i++) {
            String temp =input.substring(i,i+sub.length());
            if (sub.equals(temp)){
                ocurences++;
            }
        }
        System.out.println(ocurences);
    }
}
0
BloodAlien avatar BloodAlien 1 Точки
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CountSubstringOccurrences {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String key = sc.nextLine();

        String regex = key;
        Pattern pattern = Pattern.compile(key, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(line);

        int count = 0;
          int start = 0;
        while (matcher.find(start)) {
            count++;
              start = matcher.start() + 1;
        }

        System.out.printf("%d ", count);
    }
}
0
06/04/2016 22:49:30
EyubDjelil avatar EyubDjelil 9 Точки

Здравей колега Nani15.

Тъй като не видях отговор на въпроса ти, си поиграх и с мъка успях.

За да обходиш Stringa text с Matcher трябва да използваш метода 

public Matcher region(int start, int end);

start - The index to start searching at (inclusive)

end - The index to end searching at (exclusive)

 И ето работещ вариант на задачата ти:

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by X on 7.4.2016 г..
 */
public class ProblemTwov2 {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        String text = scanner.nextLine().toLowerCase();
        String word = scanner.nextLine().toLowerCase();

        int counter = 0;
        Pattern pattern = Pattern.compile(word);
        Matcher matcher = pattern.matcher(text);

        for (int i = 0; i < text.length() - word.length()+1; i++) {
            matcher.region(i,i+word.length());
            if (matcher.find()) {
                counter++;
            }
        }
        System.out.println(counter);
    }
}
0