Java: Pour la boucle et Si l'algorithme de
J'ai cette question à partir d'une cession à créer des magasins qui louent des livres, à l'aide d'un Store.java et Book.java. J'ai terminé cette mission, mais je suis curieux pour le meilleur algorithme pour une partie spécifique.
--
Book.java
public class Book {
private String name;
Book(String name)
this.name = name;
public String getName()
return name;
}
Store.java
À l'intérieur de main();
Book bookObj[] = new Book[3]; //Create 3 Array of Object.
bookObj[0] = new Book("Game Over");
bookObj[1] = new Book("Shrek");
bookObj[2] = new Book("Ghost");
Scanner console = new Scanner(System.in)
input = console.nextLine();
En supposant, à l'entrée = Diable.
Maintenant, j'ai besoin de faire une recherche simple pour vérifier si le livre spécifique existe.
Exemple:
for(int i = 0; i < bookObj.length; i++) {
if(bookObj[i].getName().equals(input))
System.out.println("Book Found!");
}
Apparemment, c'est une boucle qui parcourt le tableau de l'objet et vérifie si un tel Livre existe. Maintenant, le problème survient lorsque je veux donner une sortie que le Livre n'a pas été trouvé.
Exemple:
for(int i = 0; i < bookObj.length; i++) {
if(bookObj[i].getName().equals(input))
System.out.println("Book Found!");
else
System.out.println("Book not Found!");
}
Le problème avec le code ci-dessus est que le Livre n'a pas Trouvé serait imprimé trois fois. Mon objectif est d'éviter un tel problème. J'ai des solutions, mais je suis toujours à la recherche pour une meilleure utilisation qui utilise getName(), qui à mon avis a encore place à l'amélioration.
Généralement, dans structurels de la programmation, je ferais la suite,
for(int i = 0; i < bookObj.length; i++) {
if(bookObj[i].getName().equals(input))
System.out.println("Book Found!");
else if(i == bookObj.length - 1)
System.out.println("Book not Found!");
}
C'est utile pour déterminer si c'est à la fin de la boucle, et la recherche est terminée, mais il n'y a pas de réussite résultat de la recherche.
Comment dois-je penser en Orienté Objet?
Tous dans tous, ma question est,
- Est-il une meilleure façon d'écrire le code ci-dessus plutôt que de vérifier que c'est la fin de la ligne?
- Est-il une meilleure façon d'utiliser la méthode getName() ou d'utiliser d'autres méthodes?
Merci pour l'astuce, mais malheureusement, je suis attaché à utiliser un tableau d'objet pour cette mission.
OriginalL'auteur Ben C. | 2010-09-23
Vous devez vous connecter pour publier un commentaire.
Vous devez parcourir le tableau et l'utilisation d'un index /indicateur booléen pour stocker de savoir si ou non le livre se trouve. Puis imprimer le message à la fin, en fonction de l'indice /valeur de l'indicateur.
Sinon (sauf si votre travail exige expressément l'utilisation d'un tableau), vous devriez préférer un
Set
, ce qui peut faire la recherche pour vous, avec un seul appel àcontains()
.Lorsque l'on regarde une seule méthode, il n'y a pas beaucoup de différence entre la procédure et OO style. Les différences commencent à apparaître à un niveau supérieur, lorsque l'on essaie d'organiser un tas de conceptuel des données et les méthodes qui fonctionnent sur ces.
Le paradigme OO est de lier les méthodes pour les données qu'ils opèrent, et encapsuler à la fois cohérente dans les objets et les classes. Ces classes sont de préférence des représentations de l'important domaine des concepts. Donc, pour votre magasin de livre, vous voudrez peut-être mettre tout le livre connexes code dans votre
Book
classe. Cependant, cette méthode de recherche (et de la collection de livres il opère sur) n'est pas liée à un livre particulier exemple, si vous avez différents choix:Store
(probablement en tant que membres réguliers), ouBook
commestatic
membres.Le premier choix est plus naturel, donc, normalement, je préfère ça. Toutefois, dans certaines circonstances, la deuxième option serait peut-être préférable. (OO) la conception, il n'y a pratiquement jamais nettoyer "oui/non", répond - plutôt des compromis entre les différentes options, chacun ayant ses propres forces et faiblesses.
Set
) au lieu d'un tableau.+1, en particulier pour la mention de Définir
Cela m'attriste que les tableaux sont enseignées en tant que principal des structures de données. Ils sont devenus des cas à des structures de données maintenant.
OriginalL'auteur Péter Török
Vous pouvez introduire de l'état et n'oubliez pas si vous avez trouvé le livre ou pas.
Si vous n'êtes pas à l'aide de Java 1.4 ou version antérieure, vous pouvez également utiliser la boucle foreach syntaxe:
Aussi, je suggère de regarder dans le Les Collections de la bibliothèque, et de remplacer votre tableau avec une liste ou un ensemble:
Et, tout à faire, vous pourriez aussi penser à quand deux livres sont égaux et de redéfinir equals() et hashCode() en conséquence. En cas d'égalité() serait modifié pour vérifier le titre, vous pouvez simplement utiliser
books.contains(new Book(input));
et ont les bibliothèques de faire le travail pour vous.contains() n'apparaît pas dans le cahier des charges initial égal à (), cependant, fait - downvote annulés
J'ai encore édité ma réponse à inclure le contient() suggestion, car il peut être utile.
IIRC, contient va trouver des correspondances au sein de la chaîne. L'OP "exige" que Diable', ce qui implique correspondance exacte - donc, je n'hésiterais pas à utiliser contiennent
Je suis en train de faire contains() et non pas sur une Chaîne mais sur l'ensemble. Sur la Chaîne que vous êtes à droite, contient() ne serait pas une bonne idée.
OriginalL'auteur Thomas Lötzer
Pour résoudre le problème dans une meilleure façon, vous devez comprendre que la puissance de Java ne vient pas de la langue elle-même, mais à partir du Framework Java.
Vous devez maîtriser l'utilisation de la Java Collection classes (ne jamais travailler avec des tableaux plus). Ensuite, vous serez en mesure de résoudre le recherche avec juste une ligne de code:
Pour faire ce travail, vous devez également savoir comment appliquer correctement la méthode equals() de votre classe Book.
Heureux d'apprendre!
OriginalL'auteur Designpattern
Ici est une solution de travail :
OriginalL'auteur Jérôme Radix
Vous avez obtenu quelques très bons conseils à ce jour. Vous avez demandé si il y avait une plus Orienté-Objet, façon de penser le problème, donc je pensais que je voudrais essayer et de faire la lumière sur elle. Comme Pierre l'a déjà mentionné, à ce niveau de la conception, il est une méthode unique pour la mise en œuvre de l'approche va être assez similaire que dire d'une approche procédurale. Quel est l'avantage? En un mot de les réutiliser. Si vous avez besoin de trouver un livre par son nom dans beaucoup d'endroits, puis de passer le code de sa propre classe d'aider.
Donc ce que vous avez est un Livre unique instance pour encapsuler le comportement autour d'un seul livre, mais vous voulez avoir un comportement sur plusieurs livres, ou une collection de livres. Vous pouvez conserver les données (tableau de livres), et la méthode qui compte sur eux distincte, comme vous l'avez décrit dans votre programme. Cependant, si nous voulions recueillir un endroit pour faire de comportement sur une collection de livres, on peut définir une nouvelle classe. Appelons ça de la Bibliothèque, et on pourrait faire quelque chose comme ce qui suit:
Si un couple de choses à noter à propos de faire les choses de cette façon. L'une est que lorsque nous travaillons avec une Bibliothèque, nous ne savons pas il y est une Matrice de retour il. Nous pourrions utiliser un tableau, un Ensemble, une Liste ou une base de données (le plus souvent). Le point étant le code qui appelle ces fonctions fonctionne avec l'interface de la Bibliothèque (pas un littéral interface Java, mais la signature de la méthode de la Bibliothèque). Aussi c'est un plus haut niveau de l'interface. Nous ne nous inquiétons pas à parcourir les livres, faire des boucles for, if, etc. Il suffit d'appeler une méthode en disant "Hey trouver ce livre titre dans la Bibliothèque". Comment c'est fait on s'en fout. C'est la base locataire de l'Orientation de l'Objet appelé encapsulation, et c'est étonnamment puissant. C'est vraiment sur la façon dont nous déléguer la responsabilité de notre programme, et de donner les détails d'un travail individuel, de la classe ou des classes. Si la Bibliothèque n'avait seuls les membres du public (c'est à dire des livres et des bookCount), ou lecture/définition le client ne serait pas obtenir tous les avantages parce que le client aurait encore à faire tout le levage lourd. Le truc OO est de déterminer ce qui peut être délégué d'un objet, sans créer de problèmes. Ce faut de la pratique et de l'expérience.
La deuxième chose est que nous avons séparé la présentation de l'acte de la conclusion d'un livre. La méthode que vous avez écrit suppose l'étape suivante, qui est d'imprimer "Hey, nous l'avons trouvé." Cependant, objet de la Bibliothèque retourne simplement le Livre pour vous quand il le trouve, ou null si il n'a pas. Qui permet d'imprimer à la console, de les afficher dans une interface graphique, ou de sérialiser un flux JSON dans un serveur. La loi de la conclusion d'un livre est séparé de la visualisation. C'est un autre aspect important de la programmation en général, mais certains ce relative à l'orientation de l'objet et de l'encapsulation. Ce qui est généralement appelé la séparation des préoccupations. L'application de console a des préoccupations au sujet de l'appui de l'INTERFACE utilisateur, et l'impression de la console. Alors que la Bibliothèque gère le catalogage et la gestion de la collection de livre. Comment ces détails sont effectuées ni soucis.
À la fin de la Bibliothèque est une classe réutilisable. On peut l'utiliser dans une application console, ordinateur de bureau, le web ou un serveur middleware. Le plus important est que nous pouvons réutiliser les appels à findByTitle ou addBooks à partir d'emplacements multiples dans un seul programme. Aussi en mettant les méthodes avec les données dont nous créer une barrière à l'emplacement où la fonction peut être utilisée. Vous ne pouvez pas le faire n'importe où dans votre programme. Vous devez disposer d'une référence à la Bibliothèque. Si vous n'avez pas de référence à une Bibliothèque de l'instance, alors vous ne devriez pas être en l'appelant. Cela peut être problématique pour les nouveaux développeurs parce qu'ils manquent de l'expérience pour bien organiser ses programmes, afin de ne pas avoir des ennuis avec cette (alors qu'ils commencent à faire des objets de valeur, de la création de la statique, les singletons, etc et les choses se transformer en une grosse boule de boue). C'est une épée à double tranchant.
Une chose que je voudrais souligner est que nous voulions modèle de deux Bibliothèques. Nous avons une Bibliothèque de uptown et downtown, et nous voulons permettre aux gens de vérifier les livres de Bibliothèque. Avec OO c'est vraiment facile à représenter:
Maintenant, nous pouvons vérifier les livres de l'un ou de l'autre. Et je n'ai pas utilisé la statique (c'est à dire des variables globales) afin de réutiliser cette logique est vraiment facile. Ce sont les bases de OO de sorte qu'ils sont vraiment en profondeur des sujets. Étrange comment je peux écrire tellement très simples sujets. De toute façon j'espère que cela vous a aidé à comprendre votre programme un peu plus loin, et de voir comment vous pouvez utiliser OO pour vous aider.
OriginalL'auteur chubbsondubs
chubbsondubs est venu le plus proche de donner une réponse correcte à cette question
Ce qu'il a manqué, c'est que son algorithme est incorrect parce qu'il contient deux tests, lorsqu'une seule est nécessaire. Le code ne nécessite que 3 états et est comme suit:
Nettement plus petit et plus rapide que toutes les autres solutions. Simplifier, simplifier, simplifier.
Code orienté objet est une béquille pour soutenir les pauvres dessins qui seraient trop complexes à comprendre. L'objectif est d'écrire un code qui est si facile à comprendre et à maintenir que l'OO n'est pas nécessaire et permettrait de rendre le programme pire. Lorsque votre programme peut être amélioré par l'ajout d'OO, cela signifie que vous faites quelque chose de mal pour commencer.
ArrayIndexOutOfBoundsException
sur la première ligne, le tout dans le dénigrement d'autres solutions pour "incorrect". Pour ne pas mentionner ignorant Java conventions de codage.La technique utilisée dans mon code est la méthode la plus efficace. La première ligne initialise une sentinelle (lire Knuth 1.4.4). Un peu comique pour "programmeur" qui utilise le drapeau variables et ne sait même pas ce qu'est une sentinelle est d'être critique de mon code.
Vous êtes constamment en effectuant des allégations (basé sur les informations minimales) à propos de ce que les autres peuvent ou ne peuvent pas connaître la programmation. Soyez assuré que j'ai lu Knuth et de savoir ce qu'une sentinelle. Cependant, ce qui fonctionne dans une langue ne peut pas être automatiquement porté à l'autre. Et de l'exactitude des atouts d'efficacité. Il est un fait que l'indexation d'un tableau Java un passé sa taille allouée conduit à une
ArrayIndexOutOfBoundsException
. (À moins que vous assurez-vous de réserver un élément supplémentaire à l'avance - ce qui peut ne pas toujours être possible, et n'est mentionné nulle part dans votre réponse de toute façon.)OriginalL'auteur Tyler Durden