所以我在这里有这个Bag类,我添加了一个remove(T x)
方法,现在我想要打印这个,我知道我必须使用toString()
方法但是我一直在使用编译错误或仍然获得对象的哈希码b
...我对此有所解释但仍然无法正常工作,我的解决方案(特定)给了我return bag[i]
的错误line:(
class Bag<T> {// generic class with T standing for a class
private T[] bag =(T[])(new Object[100]);
private int numElements = 0; // junk in bag[numElements..]
void add(T x) { // put x in bag
bag[numElements] = x; numElements++;
}
void remove (T x){
if(x!=null && numElements>0){
for(int i = 0; i < numElements; i++){
if(bag[i]==x){
bag[i]=bag[numElements];
numElements-=1;
}
}
}
}
int freq(T x) { // how many x’s in bag?
int count = 0;
for (int i=0; i<numElements; i++)
if (bag[i].equals(x)) // .equals because T a class
count++;
return count;
}
public String toString(){
for(int i = 0; i < numElements; i++){
return bag[i];
}
}
}
class GenericExample {
public static void main(String[] args) {
Bag<String> b = new Bag<String>();
b.add("cat"); b.add("dog"); b.add("cat");
}
}
我也尝试输入String.valueOf(bag[i])
,但仍然有编译错误......为什么还有问题?在这个例子中,T是一个字符串,所以我无法理解它为什么这样做..
答案 0 :(得分:4)
您可能希望更改toString方法,如下所示:
public String toString(){
return Arrays.toString(bag);
}
或家庭酿造版
public String toString(){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < numElements; i++){
sb.append(bag[i]);
}
return sb.toString();
}
如果放入包中的对象没有覆盖toString,那么你会得到一串哈希码。
答案 1 :(得分:2)
如何使用Arrays.toString()
:
public String toString(){
return Arrays.toString(bag);
}
答案 2 :(得分:2)
喜欢这个
public String toString(){
return Arrays.toString(bag);
}
答案 3 :(得分:1)
当需要String时,不能返回Object。
使用return bag[i].toString()
另外
public String toString(){
for(int i = 0; i < numElements; i++){
return bag[i];
}
}
您只能从该功能返回一次。你不能把return语句放在循环中。您可以使用StringBuilder将所有数据附加到循环中,最后调用toString()并从循环外部返回。
答案 4 :(得分:0)
你为什么要多次回来?您是否只想连接所有索引值?
public String toString(){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < numElements; i++){
sb.append(bag[i] + ", ");
}
return sb.toString();
}