сравнивая строки в Java - PullRequest
0 голосов
/ 01 апреля 2011

Добрый вечер,

Меня попросили записать код, который с учетом 2 отсортированных массивов строк возвращает количество строк, которое появляется в обоих массивах.

РешениеДля этого кода должен быть линейным, что означает, что я должен пройти через каждый массив только один раз.В противном случае мы можем просто сопоставить каждую строку со всеми строками в другом массиве.

Например:

sharedStr ({"Call", "me", "Ishmael"}, {"Call"," me "," Jonha "}) -> 2

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

Как можно сравнить две строки в любом случае?Это ошибка компилятора.(Я использую затмение. Я заметил, что символы можно сравнивать автоматически).

Спасибо, ребята.

Ответы [ 8 ]

4 голосов
/ 01 апреля 2011

Что означает отсортированные массивы, содержащие строки?Там нет никакого специального описания того, как это было отсортировано.что такое обычная обычная сортировка строк?

Это означает, что элементы в массиве упорядочены в естественной последовательности.Для строк это алфавитный порядок с прописными словами перед заглавными.

Как можно сравнить две строки в любом случае?

С помощью метода compareTo.Если он возвращает 0, они равны, если возвращено <0, первая строка меньше второй, если возвращается> 0, строка выше, чем вторая.

Что касается линейного подсчета повторений, смотрите это: сравнение строк в Java

2 голосов
/ 01 апреля 2011
int x =  0;
int i= 0;
int j = 0;
while(i != list1.length && j != list2.length){
  int v = list1[i].compareTo(list2[j]);
  if (v == 0){
    x++;i++;j++;
  }else if (v < 0){
    i++;
  } else {
    j++;
  }
}
return x;

Это делает прямое предположение, что строки отсортированы с использованием String.compareTo, что имело бы смысл.

2 голосов
/ 01 апреля 2011
  1. Строки обычно упорядочены в лексикографическом порядке (в алфавитном порядке). Однако до тех пор, пока порядок упорядочен, точный метод упорядочения не важен для этой проблемы (например, они могут быть отсортированы в обратном порядке).
  2. Java сравнивает объекты (не ссылки на объекты), используя .equals() (для логического значения) или .compareTo() (для реляционного сравнения) Например:

.

String a = "Hello";
a.equals("Hello"); // true
String b = "Not hi";
b.equals(a); // false

Будьте осторожны, случайно используя == - для константных строк, из-за дизайнов виртуальных машин, он может фактически сказать, что две строки равны, поскольку они на самом деле являются одним и тем же объектом.

1 голос
/ 01 апреля 2011

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

Тогда вы начнете сравнивать элемент за элементом и прогрессировать одну или обе ссылки соответственно. Вот псевдокод:

def sharedStr(lista, listb):
    indexa = indexb = 0
    shared = 0

    while 1:
        try:
            a = lista[indexa]
            b = listb[indexb]
        except IndexError:     # we fell off one of the lists
            break

        if a == b:
            shared += 1
            indexa += 1
            indexb += 1
        elif a < b:
            indexa += 1
        else:    # b < a
            indexb += 1

    return shared

Да, это также допустимый код Python. ; -)

1 голос
/ 01 апреля 2011

Во-первых, вторая часть вашего вопроса:

Сравнение строк в Java не так просто, как:

if(sStringOne == sStringTwo)
    //Equal

Вместо этого вы должны использовать методы класса строк

if(sStringOne.equals(sStringTwo)
    // Equal

Во-вторых, первая часть вашего вопроса:

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

  1. Создайте целочисленную переменную, инициализированную нулем, для подсчета совпадений.
  2. Loopчерез массив один 2.1 Для каждого индекса проверьте, присутствует ли его строка в другом массиве, сделайте это с помощью функции содержащий пример функции * 2.2 Если строка найдена в другом массиве, счетчик приращения.
  3. читать счетчик, это количество совпадающих строк
1 голос
/ 01 апреля 2011

Если ничего не было указано относительно того, что означает упорядочение, то, вероятно, это указывает на то, что это естественный порядок строк, который является лексикографическим - из JavaDoc для соответствующей функции для сравнения двух строк - compareTo()определение лексикографического порядка скопировано и вставлено ниже.

Обратите внимание, что использование compareTo() отличается от простой проверки равенства двух строк, которая выполняется с использованием equals()* метод 1011 * (а не оператор ==, который не проверяет равенство ' значимое ', только ссылочное равенство);compareTo с другой стороны скажет вам, каково относительное упорядочение между двумя строками, т.е. они равны (возвращаемое значение 0) или одна идет перед другой?):

Этоопределение лексикографического порядка.Если две строки различны, то либо они имеют разные символы в некотором индексе, который является допустимым индексом для обеих строк, либо их длины различны, либо оба.Если они имеют разные символы в одной или нескольких позициях индекса, пусть k будет наименьшим таким индексом;затем строка, символ которой в позиции k имеет меньшее значение, как определено с помощью оператора <, лексикографически предшествует другой строке.В этом случае CompareTo возвращает разность двухсимвольных значений в позиции k в двух строках, то есть значение: </p>

 this.charAt(k)-anotherString.charAt(k)

Если нет позиции индекса, в которой они отличаются, тоболее короткая строка лексикографически предшествует более длинной строке.В этом случае, CompareTo возвращает разницу длин строк, то есть значение:

 this.length()-anotherString.length()

Это фактически означает, что они упорядочены в алфавитном порядке с более короткими строками в нижнем регистре.как в словаре.

0 голосов
/ 01 апреля 2011

Тот факт, что массивы отсортированы, является красной сельдью, это не имеет отношения к решению. Использовать карту Шаги:

  1. Для каждой строки в первом массиве сделайте следующее:
    1. сделать map.get (currentString)
    2. если это значение равно null, выполните map.put (currentString, new Integer (0))
  2. Для каждой строки во втором массиве сделайте следующее:
    1. сделать map.get (currentString)
    2. Если это ноль, игнорируйте его, это не дубликат.
    3. Если это не нуль, выполните map.put (currentString, new Integer (currentInteger.intValue () + 1);
  3. сделать map.getKeySet (). Iterator () и перебрать ключи.
  4. для каждого ключа получить значение. Значение - это количество строк в обоих массивах.
0 голосов
/ 01 апреля 2011

Поскольку массивы отсортированы, вы можете проходить по ним, зная, что вы просматриваете их по порядку.

import java.util.List;
import java.util.LinkedList;
class StringTest {
    static List<String> sharedStrings(String[] a, String[] b) {
        List<String> result = new LinkedList<String>();
        int apos = 0;
        int bpos = 0;
        while(!(apos == a.length || bpos == b.length)) {
            int comp = a[apos].compareTo(b[bpos]);
            if(comp == 0) result.add(a[apos++]);
            else if(comp > 0) bpos++;
            else apos++;
        }
        return result;
    }
    public static void main(String[] args) {
        String[] a = new String[]{"this","is","a","test"};
        String[] b = new String[]{"test","for","a","party"};

        java.util.Arrays.sort(a);
        java.util.Arrays.sort(b);

        List<String> result = sharedStrings(a,b);
        for(String s : result) System.out.println(s);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...