我们如何摆脱if/else条件?java [关闭]

r1zk6ea1  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(95)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

3天前关闭。
Improve this question
我做了这个代码:

private static void fix (List<String> hg){

        String k1 = hg.get(0);
        String k2 = hg.get(1);
        String k3 = hg.get(2);
        String k4 = hg.get(3);
        String k5 = hg.get(4);

        List <Character> d = new ArrayList<>();

            for (int j = 0; j < k1.length(); j++) {
                d.add(j, k1.charAt(j));
            }

Iterator <Character> sdf = d.iterator();
while (sdf.hasNext()){
  Character r = sdf.next();
  if (r.equals('g')){
    hg.add(k1);
  }
  if (r.equals('d')){
    hg.remove(k1);
  }
  if (r.equals('g') || r.equals('d')){ }// how to get out of this "if" beyond what I did?

}

upd:我们检查一个单词数组。如果一个单词包含“g”,它应该加倍。如果一个单词包含“d”,则应删除。如果一个单词包含'g'和'd',则应忽略它。在我的例子中,任何包含“d”或“g”2次或更多次的单词将被加倍或删除或添加。我猜这段代码的问题是第三个“if”,我们在一个单词中同时搜索“d”和“g”。
其主要思想是忽略包含字母“g”和“d”的单词。
我知道我们可以使用这样的方法:

  1. if (r.equals('g') || r.equals('d')){ continue; }
  2. if (r.equals('g') || r.equals('d')){ break; }
  3. if (r.equals('g') || r.equals('d')){ System.out.println(); }
    其中3个是无用的,原因idea告诉运算符continue作为循环中的最后一条语句是不必要的。运算符break是不合适的,因为它会破坏代码,使其无法正常工作。System.out.println()很合身,但它在控制台中腾出了巨大的空间。
qvtsj1bj

qvtsj1bj1#

您应该使用else if,然后可以应用continue命令:

Iterator<Character> sdf = d.iterator();
while (sdf.hasNext()) {
    Character r = sdf.next();
    if (r.equals('л')) {
        hg.add(k1);
    } else if (r.equals('р')) {
        hg.remove(k1);
    } else if (r.equals('g') || r.equals('d')) {
       continue;
    }
   
}
bxjv4tth

bxjv4tth2#

  • "...主要的想法是忽略包含字母'g'和'd '的单词。..."*

通过Assert它不是 gd 来限定 r,然后委托它的值。

if (!r.equals('g') && !r.equals('d')) {
    if (r.equals('л')){
        hg.add(k1);
    }
    if (r.equals('р')){
        hg.remove(k1);
    }
}

当你有类似的 * if语句 * 时,使用 *switch语句 * 通常是个好主意。
比如

if (!r.equals('g') && !r.equals('d')) {
    switch (r) {
        case 'л' -> hg.add(k1);
        case 'р' -> hg.remove(k1);
    }
}

或者,您可以为 gd 添加一个 case,并使用一个空的 * code-block *。

switch (r) {
    case 'g', 'd' -> { }
    case 'л' -> hg.add(k1);
    case 'р' -> hg.remove(k1);
}

此主题称为 “控制流”
以下是一些相关链接。

作为建议,k1 上的 * for循环 * 可以简化为 stream

d = k1.chars().mapToObj(x -> (char) x).toList()

或者,只使用 char[] 而不是 String

char[] k1 = hg.get(0).toCharArray();
for (char r : k1) {
    switch (r) {
        case 'g', 'd' -> { }
        case 'л' -> hg.add(new String(k1));
        case 'р' -> hg.remove(new String(k1));
    }
}
mrwjdhj3

mrwjdhj33#

根本不需要使用第二个循环。你可以使用String.indexOf()
使用函数式编程

public static List<String> filter(List<String> words) {
    return words.stream()
                .filter(word -> {
                    word = word.toLowerCase();
                    return !(word.indexOf('g') >= 0 && word.indexOf('d') >= 0);
                })
                .collect(Collectors.toList());
}

不使用函数式编程

public static List<String> filter(List<String> words) {
    List<String> res = new ArrayList<>(words.size());

    for (String word : words) {
        word = word.toLowerCase();
        
        if (!(word.indexOf('g') >= 0 && word.indexOf('d') >= 0))
            res.add(word);
    }

    return res;
}

相关问题