具有 3 个条件的字符串格式:可能吗?
String format with 3 conditions: is it possible?
我想格式化我的输出文本,使其与我的计数器值相对应。例如,我有 3 个计数器,当它是 1、2 和大于 2 时,我想输出不同的单词。
我试过使用字符串格式,但它只适用于 2 个不同的计数器。
这是我的代码:
package vaja13;
import java.util.Scanner;
public class Vaja13
{
public static void main(String[] args)
{
System.out.print("Vnesi besedilo: ");
Scanner sc = new Scanner(System.in);
String besedilo = sc.nextLine();
char [] tabela = besedilo.toCharArray();
int crke = 0,stevilke = 0,presledki = 0;
int i=0;
while(i<tabela.length-1)
{
if (Character.isLetter(tabela[i]))
{
crke++;
i++;
}
if (Character.isDigit(tabela[i]))
{
stevilke++;
i++;
}
if (Character.isWhitespace(tabela[i]))
{
presledki++;
i++;
}
}
System.out.println(String.format("V besedilu je %d %s ", crke,crke==2,crke >2 ? "crka":"crki":"crke"));
}
}
最后System.out.println
行,3个条件部分
crke==2,crke >2 ? "crka":"crki":"crke"
是无效的 Java 语法,您可以使用:
crke==2 ? "crka": crke > 2 ? "crki" :"crke"
虽然这有点难读。请注意,? :
运算符从右到左关联。
而不是
System.out.println(String.format("V besedilu je %d %s ", crke,crke==2,crke >2 ? "crka":"crki":"crke"));
你必须做:
System.out.println(String.format("V besedilu je %d %s ", crke, (crke==2 ? "crka": (crke > 2? "crki": "crke"))));
您可以为后缀创建查找 table,并将其与对 Math.min
的调用一起使用,如下所示:
private static String[] suffix = new String[] {"crka", "crki", "crke"};
...
for (int i = 0 ; i != 5 ; i++) {
System.out.print(i+" ");
System.out.println(String.format("V besedilu je %d %s ", i, suffix[Math.min(i, 2)]));
}
这个解决方案的核心在于表达式Math.min(i, 2)
,它对i
的非负值的计算如下:
0
当 i
是 0
1
当 1
是一个
2
当 i
为 2
或以上时。
请注意,上面的代码对于 i
的负值会失败。
感谢您的意见。我设法以这种方式解决了我的问题。
package vaja13;
import java.util.*;
class Vaja13
{
public static void main(String[] args)
{
System.out.print("Vnesi besedilo: ");
Scanner sc = new Scanner(System.in);
String besedilo = sc.nextLine();
char [] tabela = besedilo.toCharArray();
int crke = 0, stevke = 0, presledki = 0, i = 0;
while(i<tabela.length)
{
if (Character.isLetter(tabela[i]))
{
crke++;
}
else if (Character.isDigit(tabela[i]))
{
stevke++;
}
else if (Character.isWhitespace(tabela[i]))
{
presledki++;
}
i++;
}
Beseda besedaCrka = new Beseda
(
new String[]{"crk","crka","crki","crke"}
);
Beseda besedaStevka = new Beseda
(
new String []{"stevk","stevka","stevki","stevke"}
);
Beseda besedaPresledek = new Beseda
(
new String [] {"presledkov","presledek","presledka","presledki"}
);
Beseda glagolBiti = new Beseda
(
new String [] {"je","je","sta","so"}
);
System.out.format("V besedilu %s %d %s, %d %s in %d %s.\n",
glagolBiti.vrniObliko(crke),crke,besedaCrka.vrniObliko(crke),
stevke,besedaStevka.vrniObliko(stevke),
presledki,besedaPresledek.vrniObliko(presledki));
}
}
/**
* Razred Beseda shranjuje slovnično obliko besede.
*/
class Beseda
{
String oblikaBesede [];
Beseda(String oblikaBesede[])
{
this.oblikaBesede = oblikaBesede;
}
String vrniObliko(int kolicina)
{
return (kolicina < 1 || kolicina > 4? oblikaBesede[0] :
(kolicina == 2 ? oblikaBesede[2] :
(kolicina == 3 || kolicina == 4 ? oblikaBesede[3] :
oblikaBesede[1])));
}
}
我想格式化我的输出文本,使其与我的计数器值相对应。例如,我有 3 个计数器,当它是 1、2 和大于 2 时,我想输出不同的单词。
我试过使用字符串格式,但它只适用于 2 个不同的计数器。
这是我的代码:
package vaja13;
import java.util.Scanner;
public class Vaja13
{
public static void main(String[] args)
{
System.out.print("Vnesi besedilo: ");
Scanner sc = new Scanner(System.in);
String besedilo = sc.nextLine();
char [] tabela = besedilo.toCharArray();
int crke = 0,stevilke = 0,presledki = 0;
int i=0;
while(i<tabela.length-1)
{
if (Character.isLetter(tabela[i]))
{
crke++;
i++;
}
if (Character.isDigit(tabela[i]))
{
stevilke++;
i++;
}
if (Character.isWhitespace(tabela[i]))
{
presledki++;
i++;
}
}
System.out.println(String.format("V besedilu je %d %s ", crke,crke==2,crke >2 ? "crka":"crki":"crke"));
}
}
最后System.out.println
行,3个条件部分
crke==2,crke >2 ? "crka":"crki":"crke"
是无效的 Java 语法,您可以使用:
crke==2 ? "crka": crke > 2 ? "crki" :"crke"
虽然这有点难读。请注意,? :
运算符从右到左关联。
而不是
System.out.println(String.format("V besedilu je %d %s ", crke,crke==2,crke >2 ? "crka":"crki":"crke"));
你必须做:
System.out.println(String.format("V besedilu je %d %s ", crke, (crke==2 ? "crka": (crke > 2? "crki": "crke"))));
您可以为后缀创建查找 table,并将其与对 Math.min
的调用一起使用,如下所示:
private static String[] suffix = new String[] {"crka", "crki", "crke"};
...
for (int i = 0 ; i != 5 ; i++) {
System.out.print(i+" ");
System.out.println(String.format("V besedilu je %d %s ", i, suffix[Math.min(i, 2)]));
}
这个解决方案的核心在于表达式Math.min(i, 2)
,它对i
的非负值的计算如下:
0
当i
是0
1
当1
是一个2
当i
为2
或以上时。
请注意,上面的代码对于 i
的负值会失败。
感谢您的意见。我设法以这种方式解决了我的问题。
package vaja13;
import java.util.*;
class Vaja13
{
public static void main(String[] args)
{
System.out.print("Vnesi besedilo: ");
Scanner sc = new Scanner(System.in);
String besedilo = sc.nextLine();
char [] tabela = besedilo.toCharArray();
int crke = 0, stevke = 0, presledki = 0, i = 0;
while(i<tabela.length)
{
if (Character.isLetter(tabela[i]))
{
crke++;
}
else if (Character.isDigit(tabela[i]))
{
stevke++;
}
else if (Character.isWhitespace(tabela[i]))
{
presledki++;
}
i++;
}
Beseda besedaCrka = new Beseda
(
new String[]{"crk","crka","crki","crke"}
);
Beseda besedaStevka = new Beseda
(
new String []{"stevk","stevka","stevki","stevke"}
);
Beseda besedaPresledek = new Beseda
(
new String [] {"presledkov","presledek","presledka","presledki"}
);
Beseda glagolBiti = new Beseda
(
new String [] {"je","je","sta","so"}
);
System.out.format("V besedilu %s %d %s, %d %s in %d %s.\n",
glagolBiti.vrniObliko(crke),crke,besedaCrka.vrniObliko(crke),
stevke,besedaStevka.vrniObliko(stevke),
presledki,besedaPresledek.vrniObliko(presledki));
}
}
/**
* Razred Beseda shranjuje slovnično obliko besede.
*/
class Beseda
{
String oblikaBesede [];
Beseda(String oblikaBesede[])
{
this.oblikaBesede = oblikaBesede;
}
String vrniObliko(int kolicina)
{
return (kolicina < 1 || kolicina > 4? oblikaBesede[0] :
(kolicina == 2 ? oblikaBesede[2] :
(kolicina == 3 || kolicina == 4 ? oblikaBesede[3] :
oblikaBesede[1])));
}
}