Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Java] строки


Автор: Jolia 10.9.2008, 20:39
Здрасте всем..помогите пожалста..честно пыталась сделать, но что то не до конца работает к сожалению(

Разработать метод сравнения двух строк по набору составляющих их символов (т.е., например, строки «abcd» и «bcad» считать равными, а «abcd» и «abce» - нет)

Привожу код процедуры:

Код


static void zad2()throws IOException
    {
        BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Введите первое слово: ");
        String str1=br1.readLine();
        System.out.println("Введите второе слово: ");
        String str2=br1.readLine();
        char buk1,buk2;
    
        int i,j,kod=0,k=0;
        for (i=0;i<str1.length();i=i+1)
        {buk1=str1.charAt(i);
        
            for (j=0;j<str2.length();j=j+1)
        {buk2=str2.charAt(j);
            if (buk1==buk2)
                {kod=kod+1;
            
                   
                break;};
                    };
        
            
        };
        if (kod==str1.length())
            System.out.println("Слова по буквенному составу совпадают");
            else
                System.out.println("Слова по буквенному составу не совпадают");
    }


Всем заранее спасибо)

Автор: duk 12.9.2008, 21:28
Вот тебе пример. Чуть-чуть изменил, но пытался оставить его похожим на твой. Я так понял что это какая-то лабораторная. Так вот учти на будущее, что работа с символами на прямую - довольно скользкое дело. Лучше всего, если не известен набор символов, который поступит от пользователя, использовать обращение к кодовым точкам.
Ладно, вот код:
Код

    String str1 = "abcde";
    String str2 = "badec";
    
    int counter = 0;
    if (str1.length() == str2.length()) {
      char symb1, symb2;
      for (int i = 0; i < str1.length(); i++) {
        symb1 = str1.charAt(i);
        for (int j = 0; j < str2.length(); j++) {
          symb2 = str2.charAt(j);
          if (symb1 == symb2) {
            counter++;
            break;
          }
        }
      }  
    }       
        
    if (counter == str1.length())
      System.out.println("Слова по буквенному составу совпадают");
    else
      System.out.println("Слова по буквенному составу не совпадают");


Написал за минуту, поэтому если что-то будет непонятно спрашивай.

Автор: ivg 12.9.2008, 22:32
Код

    String str1 = "abcde";
    String str2 = "badec";
    
    char[] characters1 = str1.toCharArray();
    char[] characters2 = str2.toCharArray();
    Arrays.sort(characters1);
    Arrays.sort(characters2);
        
    if (Arrays.equals(characters1, characters2))
      System.out.println("Слова по буквенному составу совпадают");
    else
      System.out.println("Слова по буквенному составу не совпадают");

 smile 

Автор: duk 13.9.2008, 00:07
ivg, крут, но все же тот код который привела автор, будет работать быстрее.  smile 

Автор: ivg 13.9.2008, 00:58
Цитата(duk @  13.9.2008,  03:07 Найти цитируемый пост)
будет работать быстрее

и неправильно:
Код

    String str1 = "aaaaa";
    String str2 = "**a**";// вместо * - любой символ
 smile 

Автор: Jolia 13.9.2008, 15:48
Товарищи, спасибо за помощь! smile 

Автор: Mayk 13.9.2008, 16:42
Цитата(duk @  13.9.2008,  04:07 Найти цитируемый пост)
ivg, крут, но все же тот код который привела автор, будет работать быстрее.  smile  

Да ну? 
В случае двух слов длины n,  у автора сложность O(n**2), в то время как у ivg'а лишь жалкие O(n log n).  дальнейшее обдумывание показывает что можно и за O(n) уложиться, используя алгоритм аналогичный сортировке подсчетом.

Код

import java.util.*;

public class a
{
    public
    static boolean compareLetters(String s1, String s2){
        // можно заменить на массив, особенно если собираются сравнивать гигабайты ДНК
        HashMap<Character, Integer> hash = new HashMap<Character, Integer>();

        for( int i = 0; i < s1.length(); i++ ){
            char c = s1.charAt(i);
            Integer j = hash.get(c);
            if(j == null){
                hash.put(c, 1);
            } else {
                hash.put(c, 1+j);
            }
        }

        for( int i = 0; i < s2.length(); i++ ){
            char c = s2.charAt(i);
            Integer j = hash.get(c);
            if(j == null){
                hash.put(c, -1);
            } else {
                if( j != 1 )
                    hash.put(c, j-1);
                else 
                    hash.remove(c);
            }
        }
        
        if( hash.isEmpty() ){
            System.out.println( "совпадают" );
            return true;
        } 
        System.out.println( "не совпадают" );
        return false;
    }
    
    public
    static void main(String[] main){
        assert compareLetters("","") == true;
        assert compareLetters("A","a") == false;
        assert compareLetters("aba","aaa") == false;
        assert compareLetters("aba","aba") == true;
    }
}

Автор: duk 13.9.2008, 23:52
ivg, Mayk, да, это я загнул (дурак), а по поводу n logn подумал, уже когда выключил комп и лег в кровать. 
ivg, извини, твое решение действительно хорошее.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)