Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть ли метод для строк, который... 
V
    Опции темы
olegrolik
Дата 14.5.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть ли в Java метод для строк, который сравнивает две строки и возвращает true в том, случае, если символы в обеих строках одинаковы.
Например: comp("123","312") возвращает true.
Если есть у кого алгоритм данного метода, то, пожалуйста, поделитесь.
Спасибо.

PM MAIL   Вверх
Hidrag
Дата 14.5.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все что есть написано в Java Platform API Specification. Погляди.


--------------------
user posted image
PM WWW ICQ   Вверх
nornad
Дата 14.5.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



String.equals(String)

Добавлено через 1 минуту и 48 секунд
Вот его реализация:
Код

    public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Hidrag
Дата 14.5.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nornad, 
"123".equals("321") будет false


--------------------
user posted image
PM WWW ICQ   Вверх
nornad
Дата 15.5.2007, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Хм... извиняюсь, невнимательно прочёл задачу.
В принципе, можно использовать нечёткое сравнение строк, но оно не даст точный результат.
Остаётся один вариант - получение строк символов для каждой исходной строки и сравнение полученного. Это если не надо учитывать количество для каждого символа. Если надо - делать мапу или двойной массив, а потом сравнивать.
В общем-то, ничего особо сложного.


olegrolik, позвольте узнать, в какой ситуации понадобилась такая функция? Может, проще обойтись проверкой на соответствие регулярному выражению? (например, если это проверка логина/пароля/мыла на валидность)


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Maksym
Дата 15.5.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



В цикле добавить все строки-символы первой строки в HashSet, потом удалить из него все встречающиеся во второй строке. И проверить размер HashSet'а. Повторяются или нет символы в строках при этом безразлично.
Но, вообще nornad прав, задача какая-то больно специфическая.. затрудняюсь придумать зачем это может быть нужно.
PM MAIL   Вверх
olegrolik
Дата 15.5.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Отвечаю зачем это нужно:
Есть задача - сгенерировать строку из 8 случайных букв английского алфавита. Затем по приложенному словарю(словарь представляет собой строки, в каждой строке слово) определить, можно ли из этих 8ми букв получить три 3ёх буквенных, три 4ёх буквенных и три 5ти буквенных слова.
Собсвенно как это определить (по три слова) не знаю как :(

Т.к. проблему рано или поздно надо решить, напишу код:
Код

char a[]=new char[28];
        double b[]=new double[28];
        int count_a=0;
        int count_b=0;
         
        while(count_a!=27) {
            b[count_b]=(Math.random()*100);
            if(b[count_b]>25) continue;
            a[count_a]=(char)('\u0061'+b[count_b]);
            count_a++;
            count_b++;                       
        }
        String str=new String("");
       
        for(int i=0;i<8;i++)
            str+=a[i];
        
        System.out.println();
        System.out.println(str);
        int k=0,n=0,m=0,count=0,cc=0;
        String s_3[]=new String[3];
        String s_4[]=new String[3];
        String s_5[]=new String[3];
        
        while(k!=3&&n!=3&&m!=3) {
        //отладка
cc++;
       
           while ((line=in.readLine())!=null) {
            if(line.length()<3||line.length()>5) continue;
              for(int i=0;i<str.length();i++) {                
                for(int j=0;j<line.length();j++){
                    if(line.charAt(j)==str.charAt(i))count++;/*System.out.println("count= "+count);*/
                    
                     
                }//System.out.println("count= "+count);
                if(count==3&&line.length()==3) {if(k==3)break;s_3[k]=line;k++;count=0;continue;}
                    if(count==4&&line.length()==4) {if(n==3)break;s_4[n]=line;n++;count=0;continue;}
                    if(count==5&&line.length()==5) {if(m==3)break;s_5[m]=line;m++;count=0;continue;}
              }
            }
        
        }
        System.out.println("cc = "+cc);
        System.out.println(k);
        System.out.println(n);
        System.out.println(m);
        for(k=0;k<3;k++)
        System.out.println("Слова из трёх букв: " + s_3[k]);
        for(n=0;n<3;n++)
        System.out.println("Слова из четырёх букв: " + s_4[n]);
        for(m=0;m<3;m++)
        System.out.println("Слова из пяти букв: " + s_5[m]);
                
        System.exit(0);


PM MAIL   Вверх
math64
Дата 15.5.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Отсортируй буквы в каждом слове по алфавиту, создай Map отсортированного слова на List из неотсортированных слов
Напиши функцию для срвнения двух отсортированных строк на принадлежность всех букв из первой строки во вторую.

PM   Вверх
olegrolik
Дата 15.5.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(math64 @ 15.5.2007,  15:08)
Отсортируй буквы в каждом слове по алфавиту, создай Map отсортированного слова на List из неотсортированных слов
Напиши функцию для срвнения двух отсортированных строк на принадлежность всех букв из первой строки во вторую.

Ничего не понял.
Зачем сравнивать две отсортированные строки?

PM MAIL   Вверх
Stampede
Дата 15.5.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



olegrolik, алгоритм может быть примерно такой:
  • Пишем функцию, которая проходит по строке и создает массив символов (а) упорядоченный и (б) не содержащий повторов. Например, для строки "на дворе трава" результатом будет " авденорт". Такой же результат мы получим и для строки "на траве дрова" - поскольку в ней используются те же самые буквы. Назовем эту функцию reduce() - сократить.
  • При написании этой функции функции воспользуемся классом из Java Collections API под названием TreeSet. Он нам отлично подходит, поскольку реализует интерфейс SortedSet.
  • Для сравнения любых двух строк прогоняем их через reduce() и сравниваем результаты между собой. Должны быть в точности идентичны.
Код приводить не буду, а то будет неинтересно smile Покажу только, как прогонять строку:

Код

TreeSet set = new TreeSet();
...
for (int i = 0; i < str.length(); i++) {
    Character ch = new Character(str.charAt(i));
    if (!set.contains(ch)) {
        set.add(ch);
    }
}
...


Можно записать то же самое чуть покомпактней и пооптимальней, но это не принципиально.

Дальше сам смогешь? smile

Добавлено через 5 минут и 31 секунду
А, блин, не увидел расширенное описание задачи. Только все равно не понятно: где и кому это все нужно? Лаба что ли такая?


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
COVD
Дата 15.5.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Наверное, автоматизация составления кроссвордов или чего-то подобного. Если в ежедневном издании публикуется такая развлекалка, то кто-то должен это все генерить 365 на год. smile 
PM MAIL   Вверх
Maksym
Дата 15.5.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



Цитата(COVD @  15.5.2007,  19:26 Найти цитируемый пост)
автоматизация составления кроссвордов

Писал такое лет 8 назад на паскале. Кстати, неплохое упражнение  smile 
PM MAIL   Вверх
olegrolik
Дата 16.5.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за советы. Вчера решил подумать сам. Задачу решил.
Ещё раз спасибо!
PM MAIL   Вверх
math64
Дата 16.5.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Код

import java.util.*;
/** Быстрый способ сортировки */
String reduce (String s) {
  char[] a = s.toCharArray();
  java.utils.Arrays.sort(a);
  int n = 0;
  for (int i=0; i < a.length; i++) {
    if (n == 0 || a[n-1] != a[i])
      a[n++] = a[i];
  }
  return new String(a, 0, n);
}
/** Генерация случайных букв */
String random(String s, int n, java.util.Random r) {
  if (s == null)
    s = "abcdefghijklmnopqrstuvwxyz";
  if (r == null)
    r = new java.util.Random();
  char[] a = s.toCharArray();
  for (int i = 0; i < n; i++) {
     int k = r.nextInt(a.length-i);
     char c = a[k];
     a[k] = a[i];
     a[i] = c;
  }
  return new String(a, 0, n);
}

boolean isSubSet(String s1, String s2) {
   // s1 = reduce(s1);
   // s2 = reduce(s2);
   for (int i=0, j=0; i < s1.length(); i++) {
      char c = s1.charAt(i);
      while(j < s2.length && s2.charAt(j) < c) j++;
      if (j < s2.length && s2.charAt(j) > c)
        return false;
   }
   return true;
}
/** Добавление слова в словарь */
void addWord (Map[] maps, String s) {
  int len = s.length();
  if (len < 3 || len > 5)
    return;
  Map map = maps[len-3];
  String r = reduce(s);
  List l = (List)map.get(r);
  if (l == null)
    map.put (r, l = new ArrayList() );
  if (! l.contains(s) )
    l.add(s);
}
/** Поиск в словаре */
String[] find(Map map, String s) {
   ArrayList res = new ArrayList();
    for(Iterator it = maps[i].keySet().iterator(); it.hasNext();) {
       String key = (String)it.next();
       if (isSubSet(key, s) {
          List l = (List)maps[i].get(key);
          res.addAll(l);
      }
   return (String[])res.toArray(new String[0]);
}


PM   Вверх
nornad
Дата 16.5.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(olegrolik @  16.5.2007,  11:31 Найти цитируемый пост)
Задачу решил.

Было бы неплохо выложить решение и пометить вопрос (тему) как решённый (над первым сообщением темы есть кнопка).


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
olegrolik
Дата 17.5.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



2 nornad: Okay.
Код

import java.io.*;
import java.util.*;
    
 public class ABC {       
   
 public static void main(String[] args) {   
     String str = new String();
     char a[]=new char[28];
     double b[]=new double[28];
     int count_a=0;
     int count_b=0;
     int k=0,l=0,m=0;
     String s_3[]=new String[3];
     String s_4[]=new String[3];
     String s_5[]=new String[3];
        while(k!=3&&l!=3&&m!=3){     
        while(count_a!=27) {
            b[count_b]=(Math.random()*100);
            if(b[count_b]>25) continue;
            a[count_a]=(char)('\u0061'+b[count_b]);
            count_a++;
            count_b++;                       
        }
         for(int i=0;i<8;i++) str+=a[i];
            
           System.out.println(s_3);  
           System.out.println(s_4);
           System.out.println(s_5);
          
         System.out.println(str);
                try {
            BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Schutzstaffeln/пЮАНВХИ ЯРНК/usa"));
            try {
                String line;
                int count=0;
                
                ArrayList a1 = new ArrayList();
                
                while ((line=in.readLine())!=null) a1.add(line);
                Iterator itr = a1.iterator();
                while(itr.hasNext()) {
                    Object element = itr.next();
                    line=element.toString();
                    if(line.length()<3||line.length()>5) continue;
                    for(int i=0;i<line.length();i++) {
                    for(int j=0;j<str.length();j++){
                                if(line.charAt(i)==str.charAt(j)) count++;
                                if(count==3&&line.length()==3) {if(k>2)break;s_3[k]=line;count=0;k++;break;}
                                if(count==4&&line.length()==4) {if(l>2)break;s_4[l]=line;count=0;l++;break;}
                                if(count==5&&line.length()==5) {if(m>2)break;s_5[m]=line;count=0;m++;break;}
                      }
                  }
                count=0;
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }       
         //if(k!=2||l!=2||m!=2)break;
         System.out.println(k);
         System.out.println(l);
         System.out.println(m);
         for(k=0;k<3;k++){System.out.print(s_3[k]);System.out.println();}
         for(l=0;l<3;l++){System.out.print(s_4[l]);System.out.println();}
         for(m=0;m<3;m++){System.out.print(s_5[m]);System.out.println();}
         
         
        }
 }
}


PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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