在另一个字符串中找到该字符串的字符有多少次

时间:2019-06-08 17:22:36

标签: java string constructor

我的教授给我做了一个练习,以查找在称为“查询”的第二个字符串中找到“过滤器”字符串的字符有多少次。 在我开始之前,我是java noob,英语不是我的母语。

示例:

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

Output:2

获取在另一个字符串中找到一个字符的次数不是我的问题,但是教授给了我们一些遵守的规则:

  • 类过滤器。该课程必须是以下公众人士 提供接口:

    • 公共过滤器(字符串字母)(→类的构造方法) 代表过滤器的字符串应存储在字母字符串中

    • 公共布尔包含(字符) 如果传递的字符包含在查询字符串中,则返回true;否则返回false -public字符串toString() 返回该类的适当的字符串表示形式(为清楚起见,我不知道他对这个表示什么!)

    • 要真正确定查询中过滤器的出现,将创建另一个类QueryResolver。

    • 该类应能够按以下方式使用: QueryResolver resolver = new QueryResolver(); int count = resolver.where(query).matches(filter).count();

    • 过滤器和查询由用户指定。

    • (我无法理解这一点!)方法“ where”和“ matches”将“ QueryResolver”配置为包括基于先前传递的变量的对计算的后续调用“ count” “查询”和“过滤器”执行。

    • 计数方法应使用过滤器先前创建的方法。

  • 不允许使用修饰符static! 我不知道他是否意味着我们不能使用static {}或我们不能使用public (static) boolean contains (char character){}

  • 我们不允许使用void

所以遇到我的问题 -我不能将char传递给包含的方法,只要它不是静态的即可。 错误“无法从静态上下文中引用非静态变量”

  • 我不明白应该使用tostirng方法做什么!

到目前为止我做了什么

  • 方法1: 因此,我只是在main方法中编写了所有内容,以检查代码的原理是否起作用,然后我想使用构造函数和其他方法来创建整个函数,但不幸的是我没有成功。
  • 方法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 :(得分:0)

正如已经提到的,重要的是要学会自己解决这些问题。作业不是为了惩罚,而是要教您如何独自学习新知识,这是计算机科学家的重要特征。

尽管如此,因为您似乎已经确实在努力解决该问题,所以这是我的解决方案,后面有一些解释。

一般概念

我觉得您不了解的第一件事是类和对象的概念。类就像对象的“蓝图”,而该对象一旦实例化就可以了。
与诸如汽车之类的东西相比, class 将描述如何制造汽车,而 object 将是汽车。

您使用public class Car { ... }描述一个类,并使用Car myCar = new Car();实例化一个对象。

一个类可以具有方法(=函数)和成员变量(=数据)。

我只重复这些概念,因为您编写的代码似乎还没有完全理解该概念。请问其他了解它的学生来帮助您。

Filter

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中。它会记录这种情况发生的次数并返回计数。

此功能要求设置filterquery。因此,重要的是在有人呼叫count()之前,他们先呼叫where(..)matches(..)。 在我们的案例中,所有这些都在一行resolver.where(query).matches(filter).count()中发生。

主要功能

我写了两个不同的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对象首先调用wherematches,最后是count。同样,此链接仅有效,因为我们在thiswhere函数中返回了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();
    }