我的教授给我做了一个练习,以查找在称为“查询”的第二个字符串中找到“过滤器”字符串的字符有多少次。 在我开始之前,我是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传递给包含的方法,只要它不是静态的即可。 错误“无法从静态上下文中引用非静态变量”
到目前为止我做了什么
在两次尝试中,我都违反了锻炼规则,但是我似乎无法独自做到这一点,这就是为什么我在这里提出问题。
第一种方法:
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;
* }
*
*/
}
很少的提示和建议对我非常有用,但是请在代码中演示您的建议,因为有时我很难理解给定建议的含义。 ;)
谢谢。
(很抱歉出现语法和类型错误;英语不是我的母语)
答案 0 :(得分:0)
正如已经提到的,重要的是要学会自己解决这些问题。作业不是为了惩罚,而是要教您如何独自学习新知识,这是计算机科学家的重要特征。
尽管如此,因为您似乎已经确实在努力解决该问题,所以这是我的解决方案,后面有一些解释。
我觉得您不了解的第一件事是类和对象的概念。类就像对象的“蓝图”,而该对象一旦实例化就可以了。
与诸如汽车之类的东西相比, class 将描述如何制造汽车,而 object 将是汽车。
您使用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()
调用中),就使用它。同样,在这里重要的是要了解类和对象之间的区别。
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
函数。您希望在开发过程中尽可能地测试代码,因此,我编写的第一个代码是固定代码,无需手动输入内容,只需单击运行即可。
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();
}