有没有什么方法可以改进与Java的String比较?

时间:2015-07-04 10:34:20

标签: java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;



public class NNNTest {
private String SkillNeed="Java;C++;C";
private String SkillHave="SQL:8;Java:9;C++:5;C:9;PHP:5";

public boolean CheckAvailable(){
    int flag=0; 
    int k;
    String [] snar=SkillNeed.split(";");
    String [] shandlevel=SkillHave.split(";");


    for(int i=0;i<snar.length;i++){
        for(k=0,flag=0;k<shandlevel.length;k++){
            if(shandlevel[k].split(":")[0].equals(snar[i])){
                System.out.println(shandlevel[k].split(":")[0]);
                flag=1;
            }
        }
        if(flag==0){
            break;
        }
    }
    if(flag==1){
        System.out.println("YES");
        return true;
    }
    else{
        System.out.println("NO");
        return false;
    }

}
public static void main(String[] args) {
    NNNTest n=new NNNTest();
    n.CheckAvailable();


}
}

该方法检查您是否有足够的技能来获得这份工作。

SkillNeed是一个字符串,具有形式&#34;技能;技能;技能......&#34;

SkillHave是你拥有的技能和水平,并且具有形式&#34;技能:等级;技能:等级; ......&#34;

这些是我输入的代码,但我觉得它很长很无聊,你还有其他改进方法的方法吗?比如跳过循环或数组或使用java给定的方法。

2 个答案:

答案 0 :(得分:2)

简单地使用java-8:

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class NNNTest {

    private static String skillNeed = "Java;C++;C"; //the skills the job need
    private static String skillHave = "SQL:8;Java:9;C++:5;C:9;PHP:5"; //skill and level you have

    public static boolean checkAvailable() { //if all the job needed skills match the skills you have
        return Arrays.stream(skillHave.split(";")).map(s -> s.split(":")[0]).collect(Collectors.toSet()).containsAll(Arrays.asList(skillNeed.split(";")));
    }

    public static void main(String[] args) {
        System.out.println(checkAvailable());
    }
}

编辑解释:

  1. 在一个集合中收集al skillHave(没有数字)。
  2. 检查一组skillHave是否包含给定集合的所有元素。
  3. 将所有SkillNeed收集到另一个Set中,并将其作为上一步的参数传递。

答案 1 :(得分:1)

另一个Java 8解决方案.. 它基本上遍历所有必需的技能,并确保使用allMatch()函数,每个技能都包含在givenSkills-String中。请记住,您必须检查&#34;:&#34;否则,&#34; C&#34;也会匹配&#34; C ++&#34;。这也确保了它与技能完全匹配,因为技能要么在开头,要么被封闭;并且:。

public static boolean checkForRequiredSkills(String requiredSkills, String givenSkills)
{
    return Arrays.stream(requiredSkills.split(";")).allMatch(skill -> givenSkills.startsWith(skill + ":") || givenSkills.contains(";" + skill + ":"));
}

早期java版本中的类似解决方案可能看起来像这样

public boolean checkAvailable()
{
    for (String skill : skillNeed.split(";"))
    {
        if (!skillNeed.startsWith(skill + ":") && !skillHave.contains(";" + skill + ":"))
            return false;
    }

    return true;
}

迭代数组或列表的首选习惯用法是使用for-each循环..

for(String str : stringArray)
doSomething(str);