所以我有这个功能,组合,它将一个字符串的所有排列添加到arraylist。
public static void combinations(String prefix, String s, ArrayList PermAttr) {
if (s.length() > 0) {
PermAttr.add(prefix + s.valueOf(s.charAt(0)));
combinations(prefix + s.valueOf(s.charAt(0)), s.substring(1), PermAttr);
combinations(prefix, s.substring(1), PermAttr);
}
}
现在,我有这个arrayList tryCK,让我们说是{“A”,“B”}。
我有另一个arrayList CK,它也是{“A”,“B”},但它是从上面的组合函数派生的。
当我尝试CTC.equals(CK)时,它返回true。
但是当我通过tryCK和CK上的另一个函数时,对于tryCK,它返回true,而CK返回false,即使它们是完全相同的列表。
所以,我的问题是,使用.valueOf(s.charAt())改变一些内部类型吗?
这很难解释,但我不想发布完整的代码。
答案 0 :(得分:2)
首先,你甚至不需要使用valueOf,因为大多数情况下,Java只是很好地将字符连接到字符串的末尾。
PermAttr.add(prefix + s.charAt(0));
其次,如果你打算使用valueOf,至少从类String中引用它,而不是String对象的实例...
PermAttr.add(prefix + String.valueOf(s.charAt(0)));
第三,更好的命名约定会有所帮助:
permAttr.add(prefix + s.valueOf(s.charAt(0)));
第四,有很多方法可以检查ArrayList的内容,尝试确保它们实际上包含相同的值而不是假设它们:
for(String s : CK)
System.out.println(s);
第五,你总结了“那么,我的问题是,是否使用.valueOf(s.charAt())改变了一些内部类型?”答案是:
valueOf(s.charAt(int))将返回一个String对象。如果你没有预料到字符串,那么是的,这会改变对象的类型。这个String通常与所有其他字符串一起使用(就像你将它连接起来的那样)并且应该执行String可以执行的任何操作。因此,如果你期望一个String类型,那么不,它不会改变任何类型。
第六,确保你是在比较字符串以使用equals()方法。
请勿使用:
if(s1 == s2)
这将检查是否在内存中引用相同的位置。
使用
if(s1.equals(s2))
这将检查字符串的值是否相同。
我认为这就是我的全部。祝你好运!
答案 1 :(得分:1)
第一个问题:当你实际上是一个静态方法时,你正在使用String.valueOf
,就像它是一个实例方法一样。这会导致非常误导性的代码。
第二个问题:您没有一致的命名约定。参数通常应该是驼峰式的 - 命名参数PermAttr
会导致方法调用,例如:
PermAttr.add(prefix + s.valueOf(s.charAt(0)));
看起来就像名为PermAttr
的类中的静态方法调用一样。
第三个问题:你无缘无故地使用String.valueOf
- 你已经在使用字符串连接,所以只使用:
prefix + s.charAt(0)
没关系。
这些人实际上都没有对错误负责(如果没有一个简短而完整的示例来证明问题我们就不能轻易告诉他们),但是他们却更难理解代码。
我建议您解决上述问题,并将其置于一个简短但完整的程序的上下文中, 演示该问题。然后应该很容易弄清楚什么是错的。