Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Java] строки, сравнение буквенного состава 
:(
    Опции темы
Jolia
Дата 10.9.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



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

Разработать метод сравнения двух строк по набору составляющих их символов (т.е., например, строки «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("Слова по буквенному составу не совпадают");
    }


Всем заранее спасибо)
PM MAIL   Вверх
duk
Дата 12.9.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: нет
Всего: 4



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

    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("Слова по буквенному составу не совпадают");


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

Это сообщение отредактировал(а) duk - 12.9.2008, 22:00
PM MAIL   Вверх
ivg
Дата 12.9.2008, 22:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: нет
Всего: 81



Код

    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 
PM MAIL   Вверх
duk
Дата 13.9.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: нет
Всего: 4



ivg, крут, но все же тот код который привела автор, будет работать быстрее.  smile 
PM MAIL   Вверх
ivg
Дата 13.9.2008, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: нет
Всего: 81



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

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

    String str1 = "aaaaa";
    String str2 = "**a**";// вместо * - любой символ
 smile 
PM MAIL   Вверх
Jolia
Дата 13.9.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



Товарищи, спасибо за помощь! smile 
PM MAIL   Вверх
Mayk
Дата 13.9.2008, 16:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



Цитата(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;
    }
}


Это сообщение отредактировал(а) Mayk - 13.9.2008, 16:46


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
duk
Дата 13.9.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: нет
Всего: 4



ivg, Mayk, да, это я загнул (дурак), а по поводу n logn подумал, уже когда выключил комп и лег в кровать. 
ivg, извини, твое решение действительно хорошее.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.