сколько раз символы строки должны быть найдены в другой строке - PullRequest
0 голосов
/ 08 июня 2019

мой профессор дал мне упражнение, чтобы выяснить, сколько раз символы строки под названием «фильтр» можно найти во второй строке под названием «запрос». прежде чем я начну, я java noob и английский не мой родной язык.

пример:

String filter="kjasd";
String query="kjg4t";

Output:2

Получение количества раз, когда символ был найден в другой строке, не моя проблема, но проблема, которую профессор дал нам некоторые правила, чтобы придерживаться:

  • фильтр класса. Класс должен быть следующим публичным Обеспечить интерфейсы:

    • публичный фильтр (строковые буквы) (→ конструктор класса) Строка, представляющая фильтр, должна храниться в строке букв

    • public boolean содержит (символ) Возвращает true, если переданный символ содержится в строке запроса, иначе false -public String toString () Возвращает соответствующее строковое представление класса (для ясности, я понятия не имею, что он имеет в виду под этим!)

    • Чтобы фактически определить вхождения фильтра в запросе, должен быть создан другой класс QueryResolver.

    • Класс должен использоваться следующим образом: QueryResolver resolver = new QueryResolver(); int count = resolver.where(query).matches(filter).count();

    • фильтр и запрос задаются пользователем.

    • (я не мог понять это!) Методы "где" и "совпадения" настраивают "QueryResolver" для включения последующего вызова "count" вычисления на основе ранее переданных переменных "запрос" и "фильтр" выполняет.

    • Метод подсчета должен использовать ранее созданный фильтр.

  • Модификатор static нельзя использовать! Я не знаю, если он имеет в виду, что мы не можем использовать static {} или мы не можем использовать public (static) boolean contains (char character){}

  • нам не разрешено использовать void

поэтому проблемы, с которыми я столкнулся - Я не могу передать символ, содержащийся в методе, пока он не является статичным. ошибка «На статическую переменную нельзя ссылаться из статического контекста»

  • я не понял, что мне делать с методом toStirng!

что я сделал до сих пор:

  • Подход № 1: поэтому я просто написал все в основном методе, чтобы проверить, работает ли принцип моего кода или нет, а затем я хотел создать это целое с помощью конструктора и других методов, но, к сожалению, у меня ничего не вышло.
  • Подход № 2: затем я попытался написать код маленьким mthoden, как в упражнении, но у меня ничего не получилось!

в обоих случаях я нарушил правила упражнения, но, похоже, я не могу сделать это в одиночку, поэтому я разместил вопрос здесь.

ПЕРВЫЙ ПОДХОД:

public class filter{
    public filter(String letters) {
        //constructor of the class
        String filter;
        int count;
    }
    public boolean contains (char character){
        /*Subprogram without static!
         *the problem that I can't pass any char to this method if it wasn't static
         *and I will get the following error"Non-static variable cannot be referenced from a static context"
         *I understand why I'm getting the error but I don't know how to get around it X(   */

       return true ;    
    }

    public String toString (){
        /*he told us to include it in the program but honestly, I don't know what shall I write in it -_-
         *I make it to null because you have to return something and I don't know what to do yet 
         *so, for now, I let it null. */
        return null;
    }

    public static void main(String[] args) {

        Scanner in =new Scanner (System.in);

        System.out.println("please enter the query string! ");

        String query= in.next();
        System.out.println("please enter the filter stirng!");

        String filter= in.next();
        System.out.println("the query string is : [" + query+ "]");
        System.out.println("the filter string is : [" + filter+ "]");

        int count=0;

        // I initialized it temporarily because I wanted to print it!
        //later I need to use it with the boolean contains as a public method
        boolean contains=false;

        //to convert each the query and the filter strings to chars
        char [] tempArray=query.toCharArray();
        char [] tempArray1=filter.toCharArray();

        //to iterate for each char in the query string! 
        for (int i = 0; i < tempArray.length; i++) {

            char cc = tempArray[i];
            //to iterate for each char in the filter string!
            for (int j = 0; j < tempArray1.length; j++) {
                // if the value in the filter string matches the value in the temp array then increment the counter by one!
                if(tempArray1[j] == cc){
                    count++;
                    contains=true;
                }
            }
        }

        System.out.println("the characters of the String ["+filter+"] has been found in the forworded string ["+query+"] exactly "+count+" times!" );
        System.out.println("the boolean value : "+ contains);
        in.close();

    }

}

ВТОРОЙ ПОДХОД - Но и здесь я жестоко нарушил правила задания :( - Сначала я использовал void и не использовал метод tostring. - Во-вторых, я не использовал конструктор. - Я не добавил комментарии, потому что это тот же принцип, что и моя первая попытка.

public class filter2 {

    public static void main(String[] args) {
        Scanner in = new Scanner (System.in);
        System.out.println("enter the filter string:");
        String filterStr=in.next();
        System.out.println("enter the query string:");
        String querystr =in.next();

        Filter(filterStr, querystr);
        in.close();
    }
    public static void Filter(String filterstr , String querystr){

        char [] tempArray1 = filterstr.toCharArray();
        contains(tempArray1, querystr);
    }   

    public static void contains(char[]tempArray1, String querystr){
        boolean isThere= false ;
        int counter=0;

        char [] tempArray = querystr.toCharArray(); 

        for (int i = 0; i < tempArray.length; i++) {

            char cc = tempArray[i];

            for (int j = 0; j < tempArray1.length; j++) {
                if(tempArray1[j] == cc){
                    counter++;
                    isThere=true;
                }
            }
        }
        System.out.println("the letters of the filter string has been found in the query string exactly "+counter+" times!\nthus the boolean value is "+isThere);

    }
        /*
     * sadly enough i still have no clue what is meant with this one nor whatshall i do
     * public String toString (){
     *  return null;
     * }
     * 
     */
}

Несколько советов и советов было бы очень полезно для меня, но, пожалуйста, продемонстрируйте ваши предложения в коде, потому что иногда мне может быть трудно понять, что вы подразумеваете под данным советом. ;)

Заранее спасибо.

(извините за грамматические и типовые ошибки; английский не мой родной язык)

1 Ответ

0 голосов
/ 08 июня 2019

Как уже упоминалось, важно научиться решать эти проблемы самостоятельно. Домашнее задание не для наказания, а для того, чтобы научить вас самостоятельно осваивать новые вещи, что является важной чертой ученого-компьютерщика.

Тем не менее, поскольку кажется, что вы действительно приложили некоторые усилия, чтобы решить его самостоятельно, вот мое решение, а затем приведем некоторые пояснения.

Общие понятия

Первое, что я чувствую, что вы не поняли, это концепция классов и объектов. Класс подобен «чертежу» объекта, а объект - как только вы его создали.
По сравнению с чем-то вроде автомобиля класс будет описанием того, как построить автомобиль, а объект будет автомобилем.

Вы описываете, что такое класс с public class Car { ... }, и создаете экземпляр объекта с помощью Car myCar = new Car();.

Класс может иметь методы (= функции) и переменные-члены (= данные).

Я просто повторяю эти концепции, потому что код, который вы написали, выглядит так, как будто вы еще не полностью поняли эту концепцию. Пожалуйста, попросите другого студента, который понял это, помочь вам в этом.

Фильтр класс

public class Filter{

    String letters;

    public Filter(String letters) {
        this.letters = letters;
    }

    public boolean contains (char character){
        for(int i = 0; i < letters.length(); i++) {
            if(letters.charAt(i) == character)
                return true;
        }
        return false;
    }

    public String toString (){
        return "Filter(" + letters + ")";
    }
}

Хорошо, давайте затормозим.

public class Filter{
...
}

Я думаю, вы уже получили эту часть. Здесь вы описываете структуру вашего класса.

    String letters;

Это переменная члена класса. Он уникален для каждого объекта, который вы создаете для этого класса. Снова, для деталей, спросите других студентов, которые поняли это.

    public Filter(String letters) {
        this.letters = letters;
    }

Это конструктор. Когда вы создаете свой объект, вызывается эта функция.
В этом случае все, что он делает - это принимает аргумент letters и сохраняет его в переменной класса letters. Поскольку они имеют одинаковые имена, вам нужно явно указать java, что левая переменная класса. Вы делаете это, добавляя this..

    public boolean contains (char character){
        for(int i = 0; i < letters.length(); i++) {
            if(letters.charAt(i) == character)
                return true;
        }
        return false;
    }

Это берет символ и смотрит, содержится ли оно в this.letters или нет. Поскольку здесь нет конфликта имен, вы можете опустить this..

Если я правильно понял, пропавший static был одной из ваших проблем. Если у вас static, функция привязана к классу и не привязана к объекту, то есть вы можете вызывать ее без объекта. Опять же, важно, чтобы вы понимали разницу, а если нет, спросите кого-то. (Чтобы быть точным, спросите разницу между классом, объектом, статическим и нестатическим). Это займет слишком много времени, чтобы объяснить это подробно здесь.

Но в двух словах: если функция не статическая, ее необходимо вызывать для работы объекта. Посмотрите дальше в другом классе, чтобы узнать, как это выглядит.

    public String toString (){
        return "Filter(" + letters + ")";
    }

Эта функция также не является статичной. Он используется всякий раз, когда объект должен быть преобразован в строку, как при вызове System.out.println(). Опять же, здесь важно понимать разницу между классом и объектом.

QueryResolver класс

public class QueryResolver {

    Filter filter;
    String query;

    public QueryResolver where(String queryStr) {
        this.query = queryStr;
        return this;        
    }

    public QueryResolver matches(String filterStr) {
        this.filter = new Filter(filterStr);
        return this;        
    }

    public int count() {
        int result = 0;
        for(int i = 0; i < query.length(); i++) {
            if(filter.contains(query.charAt(i))){
                result++;
            }
        }
        return result;
    }

}

Опять, давайте разберемся с этим.

public class QueryResolver {
...
}

Тело нашего класса.

Обратите внимание, что у нас здесь нет конструктора. Желательно иметь его, но в этом случае это будет пустая функция без аргументов, которая ничего не делает, поэтому мы можем просто оставить ее, и компилятор автоматически сгенерирует ее.

    public QueryResolver where(String queryStr) {
        this.query = queryStr;
        return this;        
    }

Это интересная функция. Возвращает указатель this. Поэтому вы можете использовать результат функции для выполнения другого вызова, что позволит вам объединить несколько вызовов функций вместе, например resolver.where(query).matches(filter).count().

Чтобы понять, как это работает, вы должны понимать разницу между классами и объектами и то, что именно делает указатель this. Короче говоря, указатель this - это указатель на объект, в котором в настоящее время живет наша функция.

    public QueryResolver matches(String filterStr) {
        this.filter = new Filter(filterStr);
        return this;        
    }

Это почти то же самое, что и функция where.

Интересная часть - new Filter(...). Это создает ранее обсужденный Filter -объект из описания класса и помещает его в переменную QueryResolver объекта this.filter.

    public int count() {
        int result = 0;
        for(int i = 0; i < query.length(); i++) {
            if(filter.contains(query.charAt(i))){
                result++;
            }
        }
        return result;
    }

Итерация по переменной query объекта и проверка каждой буквы, содержится ли она в filter.Он хранит счет того, сколько раз это происходит, и возвращает счет.

Эта функция требует, чтобы были установлены filter и query.Поэтому важно, чтобы, прежде чем кто-то позвонит count(), он ранее позвонит where(..) и matches(..).В нашем случае все это происходит в одной строке: resolver.where(query).matches(filter).count().

main function

Я написал две разные функции main.Вы хотите как можно больше тестировать свой код во время разработки, поэтому первый, который я написал, был фиксированным, в котором вам не нужно вводить что-то вручную, просто нажмите «Выполнить», и оно работает:

    public static void main(String[] args) {

        String filter="kjasd";
        String query="kjg4t";


        QueryResolver resolver = new QueryResolver();
        int count = resolver.where(query).matches(filter).count();

        System.out.println(count);
    }

Как только вы поймете разницу между классами и объектами, это должно быть прямо.Но повторим:

    QueryResolver resolver = new QueryResolver();

Это создаст ваш объект QueryResolver и сохранит его в переменной resolver.

    int count = resolver.where(query).matches(filter).count();

Затем эта строка использует объект resolver для первого вызоваwhere, matches и, наконец, count.Опять же, эта цепочка работает только потому, что мы возвращаем this в where и matches функциях.

Теперь, наконец, интерактивная версия, которую вы создали:

    public static void main(String[] args) {

        Scanner in =new Scanner(System.in);

        System.out.println("please enter the query string! ");

        String query= in.next();
        System.out.println("please enter the filter stirng!");

        String filter= in.next();
        System.out.println("the query string is : [" + query+ "]");
        System.out.println("the filter string is : [" + filter+ "]");

        QueryResolver resolver = new QueryResolver();
        int count = resolver.where(query).matches(filter).count();

        System.out.println("the characters of the String ["+filter+"] has been found in the forworded string ["+query+"] exactly "+count+" times!" );
        in.close();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...