2010-12-26 3 views
0

Итак, у меня есть эта функция, комбинации, которая добавляет в arraylist все перестановки строки.Проблема Java ArrayList (включает valueOf())

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); 
     } 
} 

Теперь у меня есть этот массивList tryCK, который, скажем, {{A, B}}.

У меня есть еще один массивList CK, который также является {"A", "B"}, но он был получен из функции комбинаций выше.

Когда я делаю tryCK.equals (CK), он возвращает true.

Но когда я передал его через другую функцию, которую я использую как для tryCK, так и для CK, для tryCK он возвращает true, а CK возвращает false, хотя они являются точно такими же списками.

Итак, мой вопрос в том, что использование .valueOf (s.charAt()) изменяет некоторый внутренний тип?

Это очень сложно объяснить, но я не хочу публиковать полный код.

ответ

1

Первая проблема: вы используете String.valueOf, как если бы это был метод экземпляра, когда это фактически статический метод. Это приводит к очень вводящему в заблуждение коду.

Вторая проблема: у вас нет согласованного соглашения об именах. Параметры обычно следует верблюд обсаженных - именование параметра PermAttr приводит к вызовам методам, такие как:

PermAttr.add(prefix + s.valueOf(s.charAt(0))); 

которого выглядит как статический вызов метода в классе называется PermAttr.

Третий вопрос: вы используете String.valueOf без причины - вы уже используете конкатенацию, так что, используя только:

prefix + s.charAt(0) 

будет хорошо.

Никто из них не несет ответственности за все, что не так (что мы не можем легко рассказать без краткого, но полного примера, демонстрирующего проблему), но они затрудняют понимание кода.

Предлагаю вам устранить вышеуказанные проблемы и поместить их в контекст короткой, но полной программы, которую делает. Тогда должно быть разумно легко выработать то, что не так.

2

Прежде всего, вам даже не нужно использовать valueOf, потому что, как правило, Java просто отличает конкатенирование символов до конца строк.

PermAttr.add(prefix + s.charAt(0)); 

Во-вторых, если вы собираетесь использовать valueOf, по крайней мере ссылаться на него из класса 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, то нет, он не меняет никакого типа.

В-шестых, убедитесь, что вы сравниваете строки для использования метода equals().

НЕ ИСПОЛЬЗОВАТЬ:

if(s1 == s2) 

это будет проверять, если ссылка на то же место в памяти.

USE

if(s1.equals(s2)) 

это будет проверять, чтобы увидеть, если значения строк совпадают.

Я думаю, что это все, что у меня есть. УДАЧИ!

+0

был ли это правильный ответ? – Matt

Смежные вопросы