我正在尝试编写一个程序,允许用户将String值输入到包含arrayLists的多个方法中。我有两个问题:
以下是我到目前为止所做的反馈,我们非常重视您的反馈意见:
import java.util.ArrayList;
import java.util.Scanner;
public class Animals {
public static void main(String[] args) {
Scanner user = new Scanner(System.in);
System.out.println(" Here are some animal types! ");
ArrayList<String> animalTypes = new ArrayList<String>();
animalTypes.add("Vertebrae");
animalTypes.add("Reptile");
animalTypes.add("Insect");
animalTypes.add("Amphibian");
System.out.println(" Enter new animal type");
System.out.println(" Here is your animal types list! ");
// This for loop is inadequate, I need a while loop as I don't know the exact number of entries from the user//
for (int index = 0; index < animalTypes.size(); index++) {
System.out.println(animalTypes.get(index));
}
答案 0 :(得分:1)
除了Brandon关于动物类型的很好的答案之外,OOP还可用于抽象AnimalTypeInputter
类,然后可以扩展到其他TypeInputters
{{1} } addNewType
listAllTypes
等。除了提示之外,这些方法可以从基础findType
继承
答案 1 :(得分:0)
要进行面向对象编程,需要对象。如果您不需要对象,那么您可以使用普通/传统的结构化编码。我不确定原始问题是否需要OOP,而不是没有关于需要添加什么的其他信息。
(并非每个问题都适用于OOP。当你最终使用OOP时,虽然继承很有趣,但更喜欢使用接口而不是继承。)
答案 2 :(得分:0)
我的代码似乎是线性的(我想确保我采用面向对象的编程原理)。
让你的代码“更加面向对象”可能会比这个小程序更加努力,而不是值得。当它已经足够可读时,它可能会破坏你的程序。
但是,如果您想为不同类型的动物建模,可以使用inheritance。
你可以:
Animal
班。Animal
继承的一堆“动物类型”(例如Reptile
或Amphibian
)以下是一些用于演示的简化代码。
public class Animal {}
public class Vertebrate extends Animal {}
public class Reptile extends Animal {}
public class Insect extends Animal {}
public class Amphibian extends Animal {}
因为这些“动物类型”中的每一个都继承自Animal
类,所以Java的类型系统意识这些实际上是动物,而不是像你现在一样的字符串。
这可以让你写出类似的东西......
ArrayList<Animal> animals = new ArrayList<>();
animals.add(new Reptile());
animals.add(new Insect());
请注意,这种方法确实没有意义,因为每个类都是空的。但 面向对象,就像你告诉我们你想要实现的那样。
程序代码和面向对象代码都有合适的时间和地点。这可能是程序代码的正确位置。
答案 3 :(得分:0)
1)由于程序太短,很难完全使用自定义OOP,因为你没有任何特殊的对象,接口等。你也没有真正违反OOP在这里。当你有更长的代码来使用像对象之类的东西时,OOP真的会发挥作用,它们会变得有用和高效,但在这种情况下它们并不是必需的。从技术上讲,你仍在使用OOP,因为你正在使用像ArrayList,Scanner和System这样的东西。
2)当从控制台接收未知数量的输入时,while循环是正确的方法。要检测用户何时完成,我建议使用 sentinel值。这是一个短语,当检测到时,将导致循环通过中断或返回停止。这些的一些例子是&#34;退出&#34;或&#34;停止。&#34;您在输入后检查输入,如果是这个哨兵值,您将退出循环:
while (true) {
String text = Scanner.nextLine();
if (text.equalsIgnoreCase("exit"))
break;
}
答案 4 :(得分:0)
这是一个建议。
import java.util.ArrayList;
import java.util.Scanner;
public class Animals {
public static void main(String[] args) {
Scanner user = new Scanner(System.in);
System.out.println("Here are some animal types! ");
String animals = "";
boolean loopOne = true;
char response;
ArrayList<String> animalTypes = new ArrayList<String>();
animalTypes.add("Vertebrae");
animalTypes.add("Reptile");
animalTypes.add("Insect");
animalTypes.add("Amphibian");
while(loopOne) {
System.out.println("Do you wish to enter a new animal type ?");
response = user.nextLine().charAt(0);
if (response == 'n') {
System.out.println("End of the program");
loopOne = false;
}
else if (response == 'y') {
System.out.println("Please enter your animal types");
animals = user.nextLine();
animalTypes.add(animals);
}
else {
System.out.println("Error ! Please choose y (for yes) or n (for no)");
}
}
System.out.println("\nHere's the list of the element in the ArrayList");
for(int i = 0; i < animalTypes.size(); i++) {
System.out.println(animalTypes.get(i));
}
}
答案 5 :(得分:0)
对所有人来说,问题太小了:Horsepoop!如果您不能将面向对象,原则或模式应用于一个小问题,那么您将无法将它们应用于一个大问题。这个例子实际上几近完美!
对于那些说你不需要物品的人:Bullpoop!
现在我们需要考虑很多原则,例如:
现在我们分析一下,这段代码实际上做了什么,我们把它分成了目的:
我&#34;会&#34;做这样的事情......好吧,其实不是,但为了得到这个想法,我会这样做:
MessageShower
编写showMessage(String message)
接口:对于控制台客户端,使用sysout&#39;一个摆动gui,它显示了消息对话框。UserInputReader
String readInput()
AnimalStorage
和List<Animal> getAnimalList()
addAnimal(Animal newAnimal)
AnimalDisplayer
醇>
因此我们从主程序中解析目的并尝试最小化/隐藏实现以实现失去耦合。我们隔离它们,以实现高内聚,这样你就可以测试不仅更好,而且你的主程序,因为你可以 mock 依赖项,而不必隐式地测试依赖项。由于它们是孤立的,因此更容易理解 - 它们的目的更清晰 - 因此,主程序的目的也将更容易理解!