在Java中对字符串进行排序并提取两个字符串数组的公共元素

在Java中对字符串进行排序并提取两个字符串数组的公共元素,java,string,sorting,comparison,Java,String,Sorting,Comparison,我被要求写下一个Java函数sharedStr,它通过给定2个排序的字符串数组,返回两个数组中出现的字符串数 这段代码的解必须是线性的,这意味着我必须只遍历每个数组一次。否则,我可以将第一个数组中的每个字符串与另一个数组中的所有字符串进行比较 例如,下面对sharedStr的调用 分享{呼,我,以实玛利},{呼,我,约哈}; 必须返回2。我希望您能帮助我理解包含字符串的排序数组是什么意思?对数组的排序方式没有任何特殊描述。什么是字符串的基本普通排序 如何比较两个字符串?如果我尝试这样做,我会得到

我被要求写下一个Java函数sharedStr,它通过给定2个排序的字符串数组,返回两个数组中出现的字符串数

这段代码的解必须是线性的,这意味着我必须只遍历每个数组一次。否则,我可以将第一个数组中的每个字符串与另一个数组中的所有字符串进行比较

例如,下面对sharedStr的调用

分享{呼,我,以实玛利},{呼,我,约哈}; 必须返回2。我希望您能帮助我理解包含字符串的排序数组是什么意思?对数组的排序方式没有任何特殊描述。什么是字符串的基本普通排序


如何比较两个字符串?如果我尝试这样做,我会得到一个编译器错误。我正在使用Eclipse。我注意到字符可以自动进行比较。

因为数组是经过排序的,所以您可以一步一步地遍历它们,知道您正在按顺序遍历它们

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

    }
}

如果没有明确说明排序的含义,那么它可能表明这是字符串的自然排序,是字典排序的-,字典排序的定义被复制并粘贴在下面

请注意,使用compareTo不同于使用方法检查两个字符串的相等性,而不是==运算符,后者不检查“有意义”相等性,只检查引用相等性;另一方面,compareTo将告诉您两个字符串之间的相对顺序是什么,即它们是否等于返回值0,或者一个字符串在另一个字符串之前

这就是 词典排序。如果两个字符串 是不同的,那么他们有 在某些索引中使用不同的字符 这是一个对两者都有效的索引 字符串,或其长度为 不同,或者两者都不同。如果他们有 一个或多个位置上的不同字符 索引位置,设k为最小值 该指数;然后是谁的字符串 位置k处的字符具有 较小的值,通过使用 <运算符,按词典编纂 在另一个字符串之前。在这个 case,compareTo返回差异 两个字符值的 在两个字符串中的位置k-即 是,值为:

 this.charAt(k)-anotherString.charAt(k)
 this.length()-anotherString.length()
如果没有索引位置 它们不同,然后是较短的字符串 从词典编纂的角度来看,在较长的 一串在这种情况下,比较 返回长度之差 字符串的值-即值:

 this.charAt(k)-anotherString.charAt(k)
 this.length()-anotherString.length()
这实际上意味着它们是按字母顺序排列的,首先是小写的较短字符串,就像在字典中一样

字符串通常按字母顺序排列。然而,只要排序是一致的,精确的排序方法对于这个问题并不重要,例如,它们可以被反向排序。 Java使用.equals表示布尔值或.compareTo表示关系比较来比较对象而不是对象引用,例如:

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

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

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

如何比较两个字符串

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

关于如何线性计算重复次数,请参见:


这就直接假设字符串是使用String.compareTo排序的,这是有意义的。

首先,问题的第二部分:

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

if(sStringOne == sStringTwo)
    //Equal
您应该改为使用string类的方法

if(sStringOne.equals(sStringTwo)
    // Equal
第二,你问题的第一部分:

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

创建一个初始化为零的整数变量,以统计匹配的发生次数。 循环通过数组1 2.1对于每个索引,检查其字符串是否存在于另一个数组中,使用contains函数执行此操作 2.2如果在其他数组中找到字符串,则递增计数器。 读取计数器,这是匹配字符串的数目
数组被排序这一事实是一种误导,它与解决方案无关。 使用地图 步骤:

对于第一个数组中的每个字符串,请执行以下操作: 执行map.getcurrentString操作 如果为空,则执行map.putcurrentString,new I nteger0 对于第二个数组中的每个字符串,请执行以下操作: 执行map.getcurrentString操作 如果为空,则忽略它,它不是重复的。 如果该值不为null,则执行map.putcurrentString、new IntegercurrentInteger.intValue+1; 执行map.getKeySet.iterator并遍历键。 对于每个键,获取值。该值是两个数组中的字符串计数。
假设两个列表在进入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代码-

我不知道:这里是唯一的例子:sharedStr{Call,我,Ishmael},{Call,我,Jonha} 2 sharedStr{a,c,x},{z,b,c,x,a} 3共享资源{a,b,c},{a,b,c} 3如果假设是,给定两个排序的字符串数组,那么排序的方式真的很重要吗?关于算法的问题是基于这个假设的,还是需要在答案中进行排序?对不起,第二个例子是关于未排序的代码,首先我想理解它的意思,在我写未排序的之前。如果不将每个元素与每个元素进行比较,我认为这是不可能的,除非它们已排序。@用户:我被要求为这两种情况提供线性解决方案。我编辑它以终止while循环,oops。另外,这在重复的情况下也不起作用,但是如果需要的话,可以在v==0部分轻松地进行修正。顺便说一下,有人指出,对于未排序的数组,没有线性实现。是这样吗?我应该在开始之前放弃吗?我认为对于未排序的列表,您不能在On中这样做,您当然可以在Onlog n中使用此选项进行排序。@Nir:正确-没有线性实现。试着用随机数组做一个例子,看看需要什么——这应该是不言而喻的。