比较java中的字符串

时间:2011-03-31 20:34:00

标签: java string

晚上好,

我被要求写下一个代码,通过给出2个排序的字符串数组,返回两个arryas中出现的字符串数。

此代码的解决方案必须是线性的,这意味着我必须只遍历每个数组一次。否则,我们可以将每个字符串comapre到其他数组中的所有字符串。

例如:

sharedStr({ “呼叫”, “我”, “实玛利”},{ “呼叫”, “我”, “Jonha”}) - > 2

我想帮助您理解包含字符串的排序数组是什么意思?它没有任何特殊的描述方式。什么是字符串的基本普通排序?

如何比较两个字符串之间的任何方式?这是一个编译器错误。 (我正在使用eclipse。我注意到可以自动比较字符。)

谢谢你们。

8 个答案:

答案 0 :(得分:4)

  

包含字符串的排序数组是什么意思?对它的排序方式没有任何特殊描述。什么是字符串的基本普通排序?

这意味着数组中的元素按自然顺序排序。对于字符串,这是alphebetical顺序,小写单词放在大写字母之前。

  

如何在两个字符串之间进行比较?

通过调用compareTo方法。如果它返回0,则它们的字符串相等,如果返回< 0,第一个字符串低于第二个字符串,如果返回> 0第一个字符串高于第二个字符串。

至于如何线性计算重复次数,请参阅:comparing strings in java

答案 1 :(得分:2)

  1. 字符串通常以字典方式排序(按字母顺序排列)。但是,只要排序是一致的,精确排序方法对于这个问题并不重要(例如,它们可以反向排序)。
  2. Java使用.equals()(对于布尔值)或.compareTo()(对于关系比较)比较对象(不是对象引用)例如:
  3. String a = "Hello";
    a.equals("Hello"); // true
    String b = "Not hi";
    b.equals(a); // false
    

    小心不小心使用== - 对于常量字符串,由于VM设计,它实际上可能说两个字符串相等,因为它们实际上是同一个对象。

答案 2 :(得分:2)

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排序的,这是有意义的。

答案 3 :(得分:1)

如果没有说明排序的含义,那么它可能表明字符串的自然顺序是词典 - from the JavaDoc for the appropriate function to compare two Strings - compareTo(),字典排序的定义被复制并粘贴在下面。

请注意,使用compareTo()与使用equals()方法(而不是==运算符完成的两个字符串的相等不同不检查'有意义的'相等,只检查参照相等);另一方面,compareTo会告诉你两个字符串之间的相对顺序是什么,即它们是相等的(返回值为0)还是一个先于另一个字符串?):

  

这是定义   词典排序。如果两个字符串   是不同的,然后他们要么   某些索引处的不同字符   这是两者的有效索引   字符串,或它们的长度   不同或两者兼而有之。如果他们有   一个或多个不同的字符   索引位置,让k为最小   这样的指数;然后是其中的字符串   位置k处的字符具有   通过使用确定的较小值   &lt;运算符,按字典顺序排列   在另一个字符串之前。在这   case,compareTo返回差异   中的两个字符值   在两个字符串中的位置k - 那个   是,值:

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

如果没有索引位置   它们不同,然后是较短的字符串   按字典顺序排在较长时间之前   串。在这种情况下,compareTo   返回长度的差异   字符串 - 即值:

 this.length()-anotherString.length()

这实际上意味着他们首先按字母顺序排列较小的字符串,就像在字典中一样。

答案 4 :(得分:1)

首先,问题的第二部分:

比较Java中的字符串并不像以下那么简单:

if(sStringOne == sStringTwo)
    //Equal

您应该使用字符串类

的方法
if(sStringOne.equals(sStringTwo)
    // Equal

其次,问题的第一部分:

是的,循环遍历第一个数组并计算第二个数组中每个索引的出现都很容易。由于您已指定每个数组必须只迭代一次,因此可能适合以下算法:

  1. 创建一个初始化为零的整数变量,以计算匹配的出现次数。
  2. 循环播放第一个阵列 2.1对于每个索引,检查其他数组中是否存在字符串,使用contains函数contains function example执行此操作 2.2如果在其他数组中找到string,则递增计数器。
  3. 读取计数器,这是匹配字符串的数量

答案 5 :(得分:1)

假设在输入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代码。 ; - )

答案 6 :(得分:0)

因为数组已经排序,所以你可以逐步了解它们,知道你是按顺序行走的。

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);

    }
}

答案 7 :(得分:0)

对数组进行排序的事实是一个红色的鲱鱼,它与解决方案无关。 使用Map&lt; String,Integer&gt; 步骤进行:

  1. 对于第一个数组中的每个字符串,执行以下操作:
    1. 执行map.get(currentString)
    2. 如果为null,请执行map.put(currentString,new Integer(0))
    3. 对于第二个数组中的每个字符串,请执行以下操作:
      1. 执行map.get(currentString)
      2. 如果为null,则忽略它,它不是重复的。
      3. 如果不是null,请执行map.put(currentString,new Integer(currentInteger.intValue()+ 1);
      4. 执行map.getKeySet()。iterator()并遍历键。
      5. 为每个键,获取值。该值是两个数组中的字符串数。