Qanday qilib bu for loopni WHILE pastadiriga aylantirsa bo'ladi, shunda u ham o'zgacha fikr yuritadi? (JAVA)

Qanday qilib bu for loopni WHILE pastadiriga aylantirsa bo'ladi, shunda u ham o'zgacha fikr yuritadi? Hozirgi vaqtda loopdan foydalanib, taymerni qanday qilishni bilaman ...

import java.util.Scanner;

public class VowelsCount {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Input a string: ");
        String str = in.nextLine();

        System.out.print("Number of Vowels in the string: " + vowCount(str) + "\n");
    }

    public static int vowCount(String str) {
        int count = 0;
        for (int index = 0; index < str.length(); index++) {
            if (str.charAt(index) == 'a' || str.charAt(index) == 'e' ||
                str.charAt(index) == 'i' || str.charAt(index) == 'o' ||
                str.charAt(index) == 'u') {
                count++;
            }
        }
        return count;
    }
}
1

6 javoblar

Bu harf kodi uchun barcha glogicni inoqlashtira oladigan LetterCount sinfiga tayyor:

public final class LetterCount {

    private final String str;
    private final int vowel;
    private final int consonant;

    public static LetterCount create(String str) {
        int[] count = count(str);
        return new LetterCount(str, count[0], count[1]);
    }

    private static int[] count(String str) {
        int i = str.length();
        int[] count = new int[2];

        while (--i >= 0) {
            char ch = Character.toLowerCase(str.charAt(i));

            if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
                count[0]++;
            else if (ch >= 'a' && ch <= 'z')
                count[1]++;
        }

        return count;
    }

    private LetterCount(String str, int vowel, int consonant) {
        this.str = str;
        this.vowel = vowel;
        this.consonant = consonant;
    }

    public String getStr() {
        return str;
    }

    public int getVowel() {
        return vowel;
    }

    public int getConsonant() {
        return consonant;
    }

}
2
qo'shib qo'ydi
@LuCio rahmat, buni aniqladi
qo'shib qo'ydi muallif oleg.cherednik, manba
@Eliyas mening yangilanganimni ko'rdi
qo'shib qo'ydi muallif oleg.cherednik, manba
Stream-versiyasi ham qisqartirilishi mumkin: str.chars() filtri (ch -> ch == 'a' | ch == 'e' | ch == 'i' | | ch = = 'u' || ch == 'u'). count ();
qo'shib qo'ydi muallif LuCio, manba
Sizning davringizda loit ko'rinadi! Buni "Consonants" uchun ham hisoblash uchun tahrir qila olasizmi?
qo'shib qo'ydi muallif Elias, manba

while() pastadir o'z argumentida tugatish iborasi ga ega, ya'ni indeksingizni o'rniga qo'yish va indeksni oshirish o'rniga siz bekor qilishni parametr vaqtidagi kabi belgilashingiz kerak. EDIT , indeks o'zgaruvchining loopdan oldin ishga tushirilishi kerak.

Sizning holingizda:

while(index != str.length()){
     //rest of the statement, those from your for loop
     index++;
}
2
qo'shib qo'ydi
Sizning tavsifingiz to'g'ri, lekin kod tuzilmaydi. indeks o'zgarmaydigan while -statement oldin aniqlanishi kerak.
qo'shib qo'ydi muallif LuCio, manba
@LuCio siz to'g'ri aytasiz, mening javobimni tahrir qildingiz!
qo'shib qo'ydi muallif Alan, manba

while pastadir (har qanday turdagi loop haqiqatan ham ahamiyatga ega bo'lmasa ham), unvonli va ovozli harflarni hisoblovchi count funktsiyasi.

import java.util.Scanner;

public class VowelsCount {
    public static void main(String[] args) {
        @SuppressWarnings("resource")
        Scanner in = new Scanner(System.in);

        System.out.print("Input a string: ");
        String str = in.nextLine();

        Counts counts = count(str);

        System.out.println("Number of Vowels in the string: " + counts.getVowels());
        System.out.println("Number of Consonants in the string: " + counts.getConsonants());
    }

    public static Counts count(String str) {
        int vowCount = 0;
        int consCount = 0;

        str = str.toLowerCase();

        int i = str.length();
        while(i-- > 0) {
            char ch = str.charAt(i);
            if(ch >= 'a' && ch <= 'z') {
                switch(ch) {
                    case 'a':
                    case 'e':
                    case 'i':
                    case 'o':
                    case 'u':
                        vowCount++;
                        break;
                    default:
                        consCount++;
                        break;
                }
            }
        }

        return new Counts(vowCount, consCount);
    }

    public static final class Counts {
        private int vowels;
        private int consonants;

        public Counts(int vowels, int consonants) {
            this.vowels = vowels;
            this.consonants = consonants;
        }

        public int getVowels() {
            return vowels;
        }

        public int getConsonants() {
            return consonants;
        }
    }
}

Funktsiya qanday ishlashi asosan satr ichidagi barcha belgilarni (teskari) aylantirishi va keyin uning birinchi harfini ( a va z ) va agar u bo'lsa, u unli yoki ovozli bo'lishi kerak. Shuning uchun biz qaysi birini tekshirishimiz va mos hisoblagichni oshirishimiz kerak.

1
qo'shib qo'ydi
Shu sababdan qatorni ishlatish yomon amaldir. Siz maxsus sinfni belgilashingiz kerak.
qo'shib qo'ydi muallif oleg.cherednik, manba
@ oleg.cherednik Siz funktsiyani qaytarib beradigan qatorni nazarda tutasizmi? Eh, etarlicha adolatli. O'ylaymanki, u faqat xaritani (yoki sizga o'xshagan maxsus sinf) qaytara olishi kerak.
qo'shib qo'ydi muallif TiiJ7, manba
@Elias: Yo, amaliyot mukammal qiladi, lekin Java-ga asoslangan manbalarni (masalan, Effektiv Java kabi) o'qishga yordam beradi. Yoki, masalan, fikr-mulohazalarni o'qish, odamlar Kodni tekshirish . Oxir-oqibat, hech kim mukammal kod yozmaydi, shuning uchun u haqida juda ko'p narsalarni o'ylamang. (btw, biroz ikkilanmay, uning tahrirlangan kodi hozirda int [] :) qaytadi.)
qo'shib qo'ydi muallif TiiJ7, manba
Yaxshi va yomonni bilganimda edi. O'ylab yillar davomida amaliyot o'tishi kerak deb o'ylayman.
qo'shib qo'ydi muallif Elias, manba
@ TiiJ7 bir maslahat uchun rahmat, men buni qadrlayman! Sizning kodingiz ajoyib BTW ishlaydi va aniq nima so'raganimni.
qo'shib qo'ydi muallif Elias, manba

Agar boshqa shartlarga mos kelmasa, unda boshqa shartlarga mos kelmasa, unda boshqa shartlarga ko'ra qo'shib qo'ying. shuning uchun loop siz shunday qila olasiz.

int countVow = 0;
int index = 0;
while(index != str.length())
{
    if(vowel)
    {
        countVow++;
    }

    index++
}
int countCon = index = countVow;
1
qo'shib qo'ydi
Kechirasiz, ko'rayapman, noto'g'ri postga izoh berdim
qo'shib qo'ydi muallif oleg.cherednik, manba
Iltimos, aytingchi, yuqoridagi javobda qatordan foydalanish qayerda?
qo'shib qo'ydi muallif Safwan Shaikh, manba
@Alan, bu javobni endi qabul qilishingiz mumkin :) Rahmat
qo'shib qo'ydi muallif Safwan Shaikh, manba

uchun kodi uchun kodini o'zgartirmaslik kerak emas. Har ikkisi ham buni amalga oshirishlari mumkin va for uchun ma'lum bir indeks sizning ishlatishingiz uchun yaxshi ko'rinmaguncha uni qayta ishlashga mo'ljallangan.

Idea unlilar qatori va noaniq satrlarni belgilash va ushbu String larning muvofiqligiga ko'ra taymerni oshirgan har bir duch keladigan belgi uchun.

static final String vowels = "aei...";
static final String consonants = "bcdf...";

public static int[] vowCount(String str){
  int countV = 0;
  int countC = 0;
  for (int index = 0; index < str.length(); index++){
    String currentChar = str.substring(index, index+1);
    if (vowels.contains(currentChar)){
     countV++;
    }
    else if (consonants.contains(currentChar)){
     countC++;
    }
  }

  return new int[]{countV, countC};
}

int [] qatorini qaytardim, lekin ikkita ma'lumotni saqlashni belgilashingiz mumkin bo'lgan Count sinfining bir misolini qaytarishingiz mumkin.

0
qo'shib qo'ydi
Men ham bunday emasman. Shuning uchun men "int [] qatorini qaytardim", degan gapni aytdim, lekin siz ikkita ma'lumotni saqlash uchun belgilashingiz mumkin bo'lgan "Count" sinfining misolini qaytarishingiz mumkin. "
qo'shib qo'ydi muallif davidxxx, manba
Shu sababdan qatorni ishlatish yomon amaldir. Siz maxsus sinfni belgilashingiz kerak.
qo'shib qo'ydi muallif oleg.cherednik, manba

Bu yaxshi ishlaydi: -

public static int vowCount(String str) {
            int count = 0;
            int index = 0;
            while (index < str.length()) {
                if (str.charAt(index) == 'a' || str.charAt(index) == 'e' || str.charAt(index) == 'i' || str.charAt(index) == 'o' || str.charAt(index) == 'u') {
                    count++;
                }
                index++;
            }
            return count;
        }
0
qo'shib qo'ydi