Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用for循环查找两个字符串中的常用字母_Java - Fatal编程技术网

Java 使用for循环查找两个字符串中的常用字母

Java 使用for循环查找两个字符串中的常用字母,java,Java,我试图通过使用for循环找到两个字符串中的公共字符。下面的代码工作正常,如果我提供两个完全不同的字符串,例如:one和two,但是如果我提供两个输入相同的字符串,例如:teen和teen,则无法按预期工作 import java.util.Scanner; public class CommonAlphabets { public static void main(String[] args) { try(Scanner input = new Scanner(Sys

我试图通过使用for循环找到两个字符串中的公共字符。下面的代码工作正常,如果我提供两个完全不同的字符串,例如:one和two,但是如果我提供两个输入相同的字符串,例如:teen和teen,则无法按预期工作

import java.util.Scanner;

public class CommonAlphabets {

    public static void main(String[] args) {
        try(Scanner input = new Scanner(System.in)){
            System.out.println("Enter String one ");
            String stringOne = input.nextLine();

            System.out.println("Enter String two ");
            String StringTwo = input.nextLine();

            StringBuffer sb = new StringBuffer();

            for(int i=0;i<stringOne.length();i++){
                for(int j=0;j<StringTwo.length();j++){
                    if(stringOne.charAt(i)== StringTwo.charAt(j)){
                        sb.append(stringOne.charAt(i));
                    }
                }
            }
            System.out.println("Common characters are " +sb.toString());
        }
    }
}
import java.util.Scanner;
公共类公共字母表{
公共静态void main(字符串[]args){
try(扫描仪输入=新扫描仪(System.in)){
System.out.println(“输入字符串1”);
字符串stringOne=input.nextLine();
System.out.println(“输入字符串2”);
字符串StringTwo=input.nextLine();
StringBuffer sb=新的StringBuffer();

for(int i=0;i您不需要内部for循环,而是使用
contains

    String stringOne = "one";
    String stringTwo = "one";
    StringBuilder sb = new StringBuilder();

    for(int i=0;i<stringOne.length() && i < stringTwo.length ();i++){
           if(stringOne.contains(String.valueOf(stringTwo.charAt(i))) &&
                   !sb.toString().contains(String.valueOf(stringTwo.charAt(i)))){  
                                                      // check already added
                sb.append(stringTwo.charAt(i));
           }
    }
    System.out.println (sb.toString());

你可以使用Set

    Set<Character> set = new HashSet<>();
    for(int i = 0; i<stringOne.length(); i++) {
        for(int j = 0; j < StringTwo.length(); j++) {
            if(stringOne.charAt(i) == StringTwo.charAt(j)){
                set.add(stringOne.charAt(i));
            }
        }
    }
    StringBuilder sb = new StringBuilder();
    for (Character c : set) {
        sb.append(c);
    }
    System.out.println("Common characters are " + sb);
Set Set=newhashset();

对于(int i=0;i这是最好的方法,因为它的时间复杂度是
n
,所以这是最好的方法

import java.util.Scanner;

public class CommonAlphabets
{

public static void main(String[] args)
{
    try (Scanner input = new Scanner(System.in))
    {
        System.out.println("Enter String one ");
        String stringOne = input.nextLine();

        System.out.println("Enter String two ");
        String StringTwo = input.nextLine();

        StringBuffer sb = new StringBuffer();

        /**
         * Assuming char as index of array where A-Z is from index 0 to 25 and a-z is index 26-51
         */
        int[] alphabetArray1 = new int[52];
        for(int i = 0, len = stringOne.length(); i < len; i++)
            alphabetArray1[stringOne.charAt(i) > 94 ? stringOne.charAt(i) - 71 : stringOne.charAt(i) - 65] = 1;

        int[] alphabetArray2 = new int[52];
        for(int i = 0, len = StringTwo.length(); i < len; i++)
            alphabetArray2[StringTwo.charAt(i) > 94 ? StringTwo.charAt(i) - 71 : StringTwo.charAt(i) - 65] = 1;

//          System.out.println(Arrays.toString(alphabetArray1));
//          System.out.println(Arrays.toString(alphabetArray2));

        for (int i = 0; i < 52; i++)
            if (alphabetArray1[i] == 1 && alphabetArray2[i] == 1)
                sb.append((char) (i < 26 ? i + 65 : i + 71));

        System.out.println("Common characters are " + sb.toString());
    }
}
}
import java.util.Scanner;
公共类公共字母表
{
公共静态void main(字符串[]args)
{
try(扫描仪输入=新扫描仪(System.in))
{
System.out.println(“输入字符串1”);
字符串stringOne=input.nextLine();
System.out.println(“输入字符串2”);
字符串StringTwo=input.nextLine();
StringBuffer sb=新的StringBuffer();
/**
*假设char作为数组的索引,其中A-Z是从索引0到25,A-Z是索引26-51
*/
int[]alphabetArray1=新int[52];
for(int i=0,len=stringOne.length();i94?stringOne.charAt(i)-71:stringOne.charAt(i)-65]=1;
int[]alphabetArray2=新int[52];
for(int i=0,len=StringTwo.length();i94?StringTwo.charAt(i)-71:StringTwo.charAt(i)-65]=1;
//System.out.println(Arrays.toString(alphabetArray1));
//System.out.println(Arrays.toString(alphabetArray2));
对于(int i=0;i<52;i++)
if(alphabetArray1[i]==1&&alphabetArray2[i]==1)
附加((字符)(i<26?i+65:i+71));
System.out.println(“常用字符为“+sb.toString());
}
}
}

您的方法很好,因为结果显示了您期望的结果,因此代码很好,但您需要停止复制,因此您必须为'sb'变量编写代码,以便它删除重复项,或在循环中编写代码,以便它不会提供重复项。 由于您的代码阅读起来越来越复杂,所以我更希望您创建一个方法来编写代码,以删除重复的代码

static void removeDuplicate(StringBuilder s){
    for(int i=0,i<s.length-1,i++){
        for(int j=i+1,j<s.length,j++){
            if(s.charAt(i)==s.charAt(j)){
                 s.deleteCharAt(j);
            }
        }
  }
static void removeDuplicate(StringBuilder s){

对于(inti=0,i您可以尝试的另一种方法是-组合两个输入字符串,迭代连接的字符串并返回两个字符串中存在的字符

使用
集合
将确保不会添加由于字符串串联而重复的字符

这是我写的-

import java.util.HashSet;

public class HelloWorld {

     private static Character[] findCommonLetters(String combined, String w1, String w2) {
         HashSet<Character> hash = new HashSet<>();
         for(char c: combined.toCharArray()) {
             if(w1.indexOf(c) != -1 && w2.indexOf(c) != -1) {
                 hash.add(c);
             }
         }
         return hash.toArray(new Character[hash.size()]);
     }
     public static void main(String []args){

        // System.out.println("Hello World");
        String first = "flour";
        String second = "four";
        String combined = first.concat(second);
        Character[] result = findCommonLetters(combined, first, second);
        for(char c: result) {
            System.out.print(c);
        }
        System.out.println();

     }
}
import java.util.HashSet;
公共类HelloWorld{
私有静态字符[]findCommonLetters(组合字符串、字符串w1、字符串w2){
HashSet hash=新HashSet();
for(char c:combined.toCharArray()){
如果(w1.indexOf(c)!=1和&w2.indexOf(c)!=1){
添加(c);
}
}
返回hash.toArray(新字符[hash.size()]);
}
公共静态void main(字符串[]args){
//System.out.println(“你好世界”);
先字符串=“面粉”;
字符串second=“四”;
组合字符串=第一个.concat(第二个);
字符[]结果=findCommonLetters(组合、第一个、第二个);
for(字符c:结果){
系统输出打印(c);
}
System.out.println();
}
}

演示。

定义“工作正常”。定义“未按预期工作”。所有情况下的预期输出是什么?正常工作意味着输入的公共字符,例如1和2显示为o,而输入teen和teen显示为Teeen。@gowthamjs23考虑重复字符以及解析字符串的方式。请尝试调试:)对于StringOne=teen&String2=teen,输出应该是10?或teen?@Downvoter,请始终说明您为什么对某人的评论/问题/答案进行了否决。对不起,请比较您的代码和我的代码的时间复杂度。我的代码是n,而您的代码是n^2字符串是teen和teen,因为这样的可读性肯定更好erNo,亲爱的,对于长期运行和可伸缩性来说,复杂性是第一位的。哈哈,你的代码太复杂了,以至于很难注意到其中的错误。不,亲爱的,这只是我使用的一个公式。如果你知道这个公式,它一点也不复杂。
import java.util.HashSet;

public class HelloWorld {

     private static Character[] findCommonLetters(String combined, String w1, String w2) {
         HashSet<Character> hash = new HashSet<>();
         for(char c: combined.toCharArray()) {
             if(w1.indexOf(c) != -1 && w2.indexOf(c) != -1) {
                 hash.add(c);
             }
         }
         return hash.toArray(new Character[hash.size()]);
     }
     public static void main(String []args){

        // System.out.println("Hello World");
        String first = "flour";
        String second = "four";
        String combined = first.concat(second);
        Character[] result = findCommonLetters(combined, first, second);
        for(char c: result) {
            System.out.print(c);
        }
        System.out.println();

     }
}