2015-11-14 32 views
6

Bu yüzden içinde tüm başkanların bulunduğu bir dosyam var; bunların adları, adlarının ilkleri (varsa) ve soyadı.Dize dizi adı arama

Dosyanın okunması gerekir ve bir kullanıcı aramak için bir başkanın adına girebilir ve bu başkanın görüntülenmesi gerekir.

Bir kullanıcı adı veya soyadı ile arama yapıyorsa, ancak her ikisiyle birden değil, başkanın görüntüleyicisini görüntüledim.

Örneğin, dış dosya içerir:

George,Washington,(1789-1797) 
Franklin,D.,Roosevelt,(1933-1945) 
... and so on with all the presidents 

Ben ilk isim ya türü, soyadı veya her ikisi ad ve soyadı muktedir ve (istenilen sonucu elde etmek için kullanıcı gerekmiyor tarih çoğu zaman ilgisizdir).

Çok sayıda farklı şey denedim, ancak eğer kullanıcı ad ve soyadı ile arama yaparsa, cumhurbaşkanını gösterecek kadar oraya gitmeyin. Ben dosya girişlerini this.Read uygulanacak ve (belki lname, fname ve yıl ile sınıfında) nesneler olarak onları depolamış olabilir başka yolu yoktur

public class NameSearch { 

    public static void main(String[] args) throws IOException { 

     try { 
      // read from presidents file 
      Scanner presidentsFile = new Scanner(new File("Presidents.txt")); 
      // scanner for user input 
      Scanner keyboard = new Scanner(System.in); 
      // create array list of each line in presidents file 
      ArrayList<String> presidentsArrayList = new ArrayList<String>(); 

      // prompt user to enter a string to see if it matches with a president's name 
      System.out.println("Enter a search string of letters to find a president match: "); 
      // store user input 
      String userInput = keyboard.nextLine(); 

      // add president file info to array list linesInPresidentFile 
      while (presidentsFile.hasNextLine()) { 
       presidentsArrayList.add(presidentsFile.nextLine()); 
      } // end while loop 

      String presidentNamesArray[] = presidentsArrayList.toArray(new String[presidentsArrayList.size()]); 
      String results = searchArray(presidentNamesArray, userInput); 

      //System.out.println("\nThe presidents who have \"" + userInput + "\" as part of their name are: "); 

     } catch (FileNotFoundException ex) { 
      // print out error (if any) to screen 
      System.out.println(ex.toString()); 

     } // end catch block 

    } // end main 

    // method to search for a specific value in an array 
    public static String searchArray(String array[], String value) { 

     for (int i = 0; i < array.length; i++) { 
      if (array[i].toLowerCase().contains(value.toLowerCase())) { 
       String splitter[] = array[i].split(" ,"); 
       System.out.println(Arrays.toString(splitter)); 
      } 

     } 
     return Arrays.toString(array); 
    } 

} 
+0

Sormak ister misiniz? – sunysen

+0

Umm ... ne? Evet lol sormak istiyorum ... – rockymontana

cevap

2

: Burada

Bugüne kadar ne var . Bu şekilde kullanıcı girdisinden lname arayabilir, karşılık gelen fname ile eşleştirebilirsiniz (aynı nesneler gibi). Oluşturma bir kez yapılabilir ve arama işlemi devam eden kullanıcıların rızasını uygulayan bir süre döngüsünde arama yapılabilir.

//define your class like this: 
static int i; //to keep a track of number of objects 
public class dummy{ 
string fname; 
string lname; 
string year; 
}; 

while the file content exists: 
read the line 
dummy dobj[i++] = new dummy();//allocate memory for the object 
split the different parameters (fname, lname, year) from the read line 
put these read parameters into the object 
dobj[i].fname = first; 
dobj[i].lname = second; 
dobj[i].year = y; 

//ask your user to enter the query in a specified format 
//if he enters lname, compare your input to all the object's lname, and so on 
//in case of lname && fname, compare your input to the lname first and then check for the corresponding objects fname, if they match.. display 

Aslında, programlamak istediğiniz şeyi gerçekleştirebileceğiniz birçok yol vardır. Bunu çözmek için dizi listesi dizinlerini kullanabilirsiniz. Kullanıcıdan girdiyi belirli bir biçimde alırsanız, bu listedeki dizine eşleyebilirsiniz. Ayrıca, ad ve soyadı birlikte kullanmak isterseniz, aynı listeden gelmek için ad ve soyadını temsil eden bu dizini kullanabilirsiniz.

+0

Maalesef takip ettiğimden emin değilim. Bazı başlangıç ​​kodlarını gönderebilir misin lütfen? – rockymontana

+0

Ben java yetkin değilim, ama ya, ben bir sahte kod ile yardımcı olabilirsiniz – Rubal

+0

Kendimi java yeterli değil, ve gerçekten kod açısından bunu takip edemez, ama yardım için çok teşekkürler! – rockymontana

0

Hem ad ve soyadlarına göre arama yaparken sorun yaşamanızın nedeni, girişinizi tam olarak eşleştirmeniz gerektiğinden kaynaklanır. Demek istediğim, giriş olarak George Washington kullanırsanız, programınız George,Washington,(1789-1797) satırı için bir eşleşme bulamaz. Bunun nedeni, programınızın George Washington'u tek bir dize olarak ele almasıdır. Not: giriş virgül eksik, bu yüzden George,Washington,(1789-1797) bir alt dize olarak kabul edilmeyecektir. Giriş dizeniz olarak George,Washington kullandıysanız, programınız George Washington hattını yazdıracaktır. Programınız sadece giriş dizesinin dosyanızdaki herhangi bir satırın bir alt dizesi olup olmadığını arar. Özellikle bir ad veya soyadı araması yapılmaz. Eğer giriş dizginiz olarak in kullandıysanız, gton'daki George Wash ve D'deki Frankl için bir eşleşme elde edersiniz. D. Roosevelt.

Yapabilecekleriniz, giriş verilerinizi alıp bölmek ve her bir terimi aramaktır. Sağlanan şartların tümüne veya sağlanan şartlardan en az birine uyan satırları kabul edebilirsiniz.

public static String searchArray(String array[], String value) { 
    // Uses both blank spaces and commas as delimiters 
    String[] terms = value.toLowerCase().Split("[ ,]"); 

    for (int i = 0; i < array.length; i++) { 
     String line = array[i].toLowerCase(); 
     boolean printIfAllMatch = true; 
     boolean printIfAtLeastOneMatches = false; 
     for(int j = 0 ; j < terms.length; j++) { 
      // Check that all terms are contained in the line 
      printIfAllMatch &= line.Contains(terms[j]); 
      // Check that at least one term is in the line 
      printIfAtLeastOneMatches |= line.Contains(terms[j]); 
     } 

     String splitter[] = array[i].split(" ,"); 
     if (printIfAllMatch) { 
      System.out.println(Arrays.toString(splitter)); 
     } 
     if(printIfAtLeastOneMatches) { 
      System.out.println(Arrays.toString(splitter)); 
     } 

    } 
    //I'm not sure why you're returning the original array as a string 
    //I would think it would make more sense to return an Array of filtered data. 
    return Arrays.toString(array); 
} 

Bu, ad siparişini dikkate almaz. Öyleyse, bu sizin için bir sınıf oluşturmayı ve dosyadaki her satırın yeni bir nesne olarak ayrılmasını ve soyadıyla birlikte verilen ilk ad ve ikinci terim ile sağlanan ilk terimi eşleştirmeyi denemeyi öneririm. bu etki için.

+0

Tüm bunları takdir ediyorum. Ancak bu, yazdığımdan bağımsız olarak hiçbir şey göstermiyor ... – rockymontana

+0

Neyin işe yarayıp neyin işe yaramadığını örnekler misiniz? Sanırım sorununu tam olarak anlamadım. – drg