Java ArrayList问题(涉及valueOf())
我有一个函数,combinations,它将字符串的所有排列添加到arraylist中Java ArrayList问题(涉及valueOf()),java,Java,我有一个函数,combinations,它将字符串的所有排列添加到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 +
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);
}
}
现在,我有一个数组列表tryCK,让我们说是{“A”,“B”}
我有另一个数组列表CK,也是{“A”,“B”},但它是从上面的组合函数派生的
当我做tryCK.equals(CK)时,它返回true
但是当我把它通过另一个函数时,我在tryCK和CK上都有,对于tryCK,它返回true,CK返回false,即使它们是完全相同的列表
所以,我的问题是,使用.valueOf(s.charAt())会改变一些内部类型吗
这很难解释,但我不想发布完整的代码。第一个问题:您使用的是
String.valueOf
,就好像它是一个实例方法,而实际上是一个静态方法。这导致了非常误导的代码
第二个问题:您没有一致的命名约定。参数通常应采用驼峰式-命名参数PermAttr
会导致方法调用,例如:
PermAttr.add(prefix + s.valueOf(s.charAt(0)));
这看起来像一个名为PermAttr
的类中的静态方法调用
第三个问题:您无缘无故地使用了String.valueOf
——您已经在使用字符串连接,所以只使用了:
prefix + s.charAt(0)
好的
这些人实际上都不对任何错误负责(如果没有一个简短但完整的示例来演示问题,我们很难判断),但他们使代码更难理解
我建议您解决上述问题,并将其放在一个简短但完整的程序中,该程序确实演示了问题。然后,找出错误应该相当容易。第一个问题:您使用的是
String.valueOf
,就像它是一个实例方法一样,而实际上它是一个静态方法。这导致了非常误导的代码
第二个问题:您没有一致的命名约定。参数通常应采用驼峰式-命名参数PermAttr
会导致方法调用,例如:
PermAttr.add(prefix + s.valueOf(s.charAt(0)));
这看起来像一个名为PermAttr
的类中的静态方法调用
第三个问题:您无缘无故地使用了String.valueOf
——您已经在使用字符串连接,所以只使用了:
prefix + s.charAt(0)
好的
这些人实际上都不对任何错误负责(如果没有一个简短但完整的示例来演示问题,我们很难判断),但他们使代码更难理解
我建议您解决上述问题,并将其放在一个简短但完整的程序中,该程序确实演示了问题。然后,找出错误应该是相当容易的。首先,您甚至不需要使用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))将返回字符串对象。如果您没有预料到字符串,那么是的,这会更改对象的类型。此字符串通常与所有其他字符串一起工作(如您正在使用的字符串),并且应该执行字符串可以执行的任何操作。因此,如果您希望使用字符串类型,那么不,它不会更改任何类型
第六,确保您正在比较字符串以使用equals()方法
不要使用:
if(s1 == s2)
这将检查引用是否在内存中的相同位置
使用
这将检查字符串的值是否相同
我想我只有这些了。祝你好运 首先,您甚至不需要使用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))将返回字符串对象。如果您没有预料到字符串,那么是的,这会更改对象的类型。此字符串通常与所有其他字符串一起工作(如您正在使用的字符串),并且应该执行字符串可以执行的任何操作。因此,如果您希望使用字符串类型,那么不,它不会更改任何类型
第六,确保您正在比较字符串以使用equals()方法
不要使用:
if(s1 == s2)
这将检查引用是否在内存中的相同位置
使用
这将检查字符串的值是否相同
我想我只有这些了。祝你好运