Как я могу перебрать строку в Java? - PullRequest
9 голосов
/ 30 мая 2011
public static Boolean cmprStr( String s1, String s2 )
{
    // STUFF
}

Я хочу перебрать s1, чтобы убедиться, что каждый символ в s1 включен в s2.

Ответы [ 9 ]

11 голосов
/ 30 мая 2011
public static Boolean cmprStr( String s1, String s2 )
{
    for (int i = s1.length() - 1; i >= 0; --i) {
         if (s2.indexOf(s1.charAt(i)) == -1) {
             return Boolean.FALSE;
         }
    }
    return Boolean.TRUE;
}
11 голосов
/ 30 мая 2011
  for(char c: s1.toCharArray()){
     if(s2.indexOf(c) == -1){
           return false;
     }
  }
  return true;

Предполагая, что

  s1 = "aabb";
  s2 = "ccddaannbbss";

вернет true.

8 голосов
/ 30 мая 2011
length()

даст вам длину строки

charAt( someIndex)

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

indexOf( achar )

даст вам поимку персонажа в строке или -1, если его там нет. следовательно, вы должны иметь возможность искать каждый символ в первой строке во второй.

3 голосов
/ 30 мая 2011

Все остальные ответы O (n ^ 2).Вот способ, который является линейным по времени (то есть O (n)), используя Google Guava :

  public static boolean cmprStr(String s1, String s2) {
    Set<Character> desiredCharacters = Sets.newHashSet(Lists.charactersOf(s2));
    return Sets.difference(Sets.newHashSet(Lists.charactersOf(s1)), desiredCharacters).isEmpty();
  }
2 голосов
/ 30 мая 2011
Set<Character> charsInS1 = new HashSet<Character>();
for (int i = 0; i < s1.length(); i++) {
  charsInS1.add(s1.charAt(i));
}
for (int i = 0; i < s2.length(); i++) {
  charsInS1.remove(s2.charAt(i));
}
return charsInS1.isEmpty();

Это имеет сложность O(n+m) ... ответы, использующие indexOf, имеют O(n*m) сложность.Конечно, он временно использует немного дополнительной памяти.

1 голос
/ 30 мая 2011

Каждый String также является CharSequence в Java. Следовательно, вы можете легко перебрать String, используя простой цикл for:

int n = s.length();
for (int i = 0; i < n; ++i) {
    char c = s.charAt(i);
    ...
}
1 голос
/ 30 мая 2011

Почему бы вам просто не использовать метод «равно»?

Boolean b = s1.equals(s2);
0 голосов
/ 21 августа 2016
// Here's some code I wrote to find CG ratio in a gene     
public double findCgRatio(String gene)
        {
            double cCount =0.0; 
            double gCount =0.0; 
            gene = gene.toLowerCase(); 
            for(char character : gene.toCharArray())
            {
                if(character == 'c')
                {
                    cCount++; 
                }
                else if(character == 'g')
                {
                    gCount++; 
                }

            }
            System.out.println("CG Ratio was :" + (cCount/gCount) );  
            return cCount/gCount;  // cgRatio 
        }
0 голосов
/ 30 мая 2011

Как я понимаю вопрос, это будет.

//for each character in s1
  //if s2 does not contain character return false

//return true

for(int i = 0; i < length s1; i++){
  if(!s2.contains(String.valueOf(s1.charAt(i)))){
    return false;
  }
}
return true;

Это подтверждает, что каждый символ в s1 находится в s2.Он не подтверждает ни порядок, ни их количество, и не является методом равных.

Рекурсивно:

public static Boolean cmprStr( String s1, String s2 )
{
  if(s1.length() == 0 )
  {
    return true; 
  }
  if(!s2.contains(s1.substring(0,1)))
  {
    return false;
  }
  return cmprStr(s1.substring(1), s2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...