2016-08-08 8 views
2

私は自分のAレベルコンピューティングプロジェクトに取り組んでおり、x方向の名前、パスワード、状態(単なる変数)の2次元配列を持っています。バブルソートを使用して2次元配列をソートして、データのバイナリ検索を実装できるようにしたい。ここで私が出ているコードは次のとおりです。Javaオブジェクトと2D配列

public String[][] sort(String[][] details, int len){ 
    boolean flag = false; 
    String[] temp = new String[3]; 
    int z=0; 
    do{ 
     flag = false; 
     for (int i = 0; i < len; i++){ 
      if(details[0][i].charAt(0) > details[0][i + 1].charAt(0)){ 
       flag = true; 
       temp[0] = details[0][i]; 
       temp[1] = details[1][i]; 
       temp[2] = details[2][i]; 
       details[0][i] = details[0][i + 1]; 
       details[1][i] = details[1][i + 1]; 
       details[2][i] = details[2][i + 1]; 
       details[0][i + 1] = temp[0]; 
       details[1][i + 1] = temp[1]; 
       details[2][i + 1] = temp[2]; 
      } 
     } 
     len--; 
    } while (flag); 
    return details; 
} 

それは一種の私の注意に来ているしかし、私は私が行くを試してみて、持っているのが大好きだものです。この方がはるかに簡単使用してオブジェクト指向を行うことができます。誰もが、この種の文脈で、私がオンラインで検索したガイド、形などについて話を始めることができる場所を知っていますか?そして、このようなガイドをどのように実装するのかは分かりません。

私の理解では、名前、パスワード、状態という3つの変数を持つオブジェクトを設定します。私が名前を呼んだときに、パスワードと状態の詳細を得ることもできました。私はここの右の線に沿っていますか?もしそうなら誰でも私にこのことをどうやって見せてもらえますか?

ありがとうございます。

サム

編集 - すべてのヘルプみんなのため おかげで、これのおかげで、私は私のプロジェクトでこれを実装する方法を働いてきた、そしてコードを作る方法をはるかに簡単素晴らしいです!どうもありがとう!

public class loginDetailsOO { 
public static void main (String[] args){ 
    loginDetailsOO object = new loginDetailsOO(); 
    object.run(); 
} 
public void run(){ 
    String password = encrypt("password"); 
    String location = "textFiles\\PasswordScreen.txt"; 
    int lines = numberOfLines(location); 
    User[] user = fileToArray(location, lines); 
    int index = searchForUsername(user, lines/4, "VELINGUARD"); 
    if (password.equals(user[index].getPassword())){ 
     System.out.println("entrance is granted"); 
    } 
    User u = new User("ball", "pass", 0); 
    addToFile(u, "VELINGUARD"); 
} 
public void addToFile(User newUser, String currentUsername){ 
    String location = "textFiles\\PasswordScreen.txt"; 
    newUser.setUsername(newUser.getUsername().toUpperCase()); 
    int lines = numberOfLines(location); 
    User[] user = fileToArray(location, lines); 
    int line = lines/4; 
    int index = searchForUsername(user, line, currentUsername); 
    if (user[index].getState() == 1){ 
     if (searchForUsername(user,line, newUser.getUsername()) == -1) { 
      newUser.setPassword(encrypt(newUser.getPassword())); 
      user[line] = newUser; 
      user = sort(user, line); 
      writeToFile(location, user, line); 
     } else { 
      System.out.println("User already exists"); 
     } 
    } else { 
     System.out.println("Permission not granted"); 
    } 
} 

public User[] sort(User[] user, int len){ 
    boolean flag = false; 
    User temp; 
    int z=0; 
    do{ 
     flag = false; 
     for (int i = 0; i < len; i++){ 
      if(user[i].getUsername().compareTo(user[i + 1].getUsername()) > 0){ 
       flag = true; 
       temp = user[i]; 
       user[i] = user[i + 1]; 
       user[i + 1] = temp; 
      } 
     } 
     len--; 
    } while (flag); 
    return user; 
} 


public String encrypt (String password){ 
    String encrypted = ""; 
    char temp; 
    int ASCII; 
    for (int i = 0; i < password.length(); i++){ 
     temp = password.charAt(i); 
     ASCII = (int) temp; 
     if (ASCII >= 32 && ASCII <= 127) 
     { 
      int x = ASCII - 32; 
      x = (x + 6) % 96; 
      if (x < 0) 
       x += 96; //java modulo can lead to negative values! 
      encrypted += (char) (x + 32); 
     } 
    } 
    return encrypted; 
} 
public String decrypt (String password){ 
    String decrypted = ""; 
    char temp; 
    int ASCII; 
    for (int i = 0; i < password.length(); i++){ 
     temp = password.charAt(i); 
     ASCII =(int) temp; 
     if (ASCII >= 32 && ASCII <= 127) 
     { 
      int x = ASCII - 32; 
      x = (x - 6) % 96; 
      if (x < 0) 
       x += 96; 
      decrypted += (char) (x + 32); 
     } 
    } 
    return decrypted; 
} 
public User[] fileToArray(String file, int lines) { 
    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(file))); 
     int line = lines/4; 
     String temp[] = new String[3]; 
     User[] user = new User[line]; 
     for (int i = 0; i < line; i++){ 
      temp[0] = reader.readLine(); 
      temp[1] = reader.readLine(); 
      temp[2] = reader.readLine(); 
      reader.readLine(); 
      user[i] = new User(temp[0], temp[1], Integer.parseInt(temp[2])); 
     } 
     return user; 
    } catch(Exception e){ 
     System.out.println("File not found"); 
     return null; 
    } 
} 
public void writeToFile(String location, User[] user, int length){ 
    try { 
     File f = new File(getClass().getResource(location).toURI()); 
     f.setWritable(true); 
     FileWriter w = new FileWriter(f); 
     BufferedWriter writer = new BufferedWriter(w); 
     wipeFile(f); 
     for (int i = 0; i <= length; i++){ 
      writer.write(user[i].getUsername()); 
      writer.newLine(); 
      writer.write(user[i].getPassword()); 
      writer.newLine(); 
      writer.write(user[i].getState()); 
      writer.newLine(); 
      writer.write("-"); 
      writer.newLine(); 
     } 
     writer.close(); 
     f.setReadOnly(); 
    } catch(Exception e){System.out.println("error writing to file");} 
} 
public void wipeFile(File f) { 
    try { 
     PrintWriter wiper = new PrintWriter(f); 
     wiper.println(""); 
    } catch (Exception ex) { 
     System.out.println("error wiping file"); 
    } 
} 
public int searchForUsername(User[] user, int lines, String name){ //implements binary search 
    int low = 0; 
    int high = lines - 1; 
    int mid; 
    while (low <= high){ //by using a while loop it means if it is an empty file than there will be no issue 
     mid = low + high; 
     mid = mid/2; 
     if ((int) name.charAt(0) > (int) user[mid].getUsername().charAt(0)){ 
      low = mid + 1; 
     } else if ((int) name.charAt(0) < (int) user[mid].getUsername().charAt(0)) { 
      high = mid - 1; 
     } else { 
      if (user[mid].getUsername().equals(name)){ 
       return mid; 
      } 
      else { 
       int pass = 0; 
       do{ 
        if (user[mid - pass].getUsername().equals(name)){ 
         return mid - pass; 
        } else if (user[mid + pass].getUsername().equals(name)) { 
         return mid + pass; 
        } 
       } while (true); 
      } 
     } 
    } 
    System.out.println("Name not found"); 
    return -1; 
} 
public int numberOfLines(String file) { 
    try{ 
     LineNumberReader lnr = new LineNumberReader(new InputStreamReader(getClass().getResourceAsStream(file))); 
     lnr.skip(Long.MAX_VALUE); 
     int length = (lnr.getLineNumber() + 1); //Add 1 because line index starts at 0 
     lnr.close(); 
     return length; 
    }catch(Exception e){ 
     System.out.println("File not Found"); 
     return 0; 
    } 
} 

と::この問題に苦しんで誰のために、これは私の最終的なコード です

public class User{ 
private String username; 
private String password; 
private int state; 

public User(){ 
    username = ""; 
    password = ""; 
    state = 0; 
} 
public User(String user, String pass, int st){ 
    username = user; 
    password = pass; 
    state = st; 
} 
public void setUsername(String name){ 
    username = name; 
} 
public void setPassword(String pass){ 
    password = pass; 
} 
public void setState(int st){ 
    state = st; 
} 
public String getUsername(){ 
    return username; 
} 
public String getPassword(){ 
    return password; 
} 
public int getState(){ 
    return state; 
} 
+0

一部のフィールドを持つ 'Detail'クラスの作成を開始します。とにかく、バブルソートは学ぶのに最適ですが、バイナリ検索を続けるつもりならば完全にベストではありません –

+0

これは3つのフィールドを持つモデルクラスのコレクションではなく2次元のString配列であり、匹敵します? – Tom

+1

@Tomあなたが描いていることは、OPがやることを学びたいと思っているものです。それが問題の目的です。 – nhouser9

答えて

1

バブルソートは、シンプルなアプローチが時には最悪のアプローチになる可能性がある例として、コンピュータサイエンスの1つのコンテキストでのみ使用されることを意味します。ソートについて他のことを覚えていない場合は、バブルソートを使用しないでください(クイックソートはほとんどの場合より安全です)。

オブジェクトの向きでこれを行うには、オブジェクトが必要です。これらは、「名詞」が問題を記述しているコードと同等です。これはあなたが必要となるのかもしれません(最小限)A:

  • 一覧
  • エントリ
  • 比較(シング)

問題は何かの順序はアクションがあるということである(動詞)通常は名詞ではありません。しかし、私たちはそれを名詞にすることができます( "gerunds"を持っていることに感謝します)。これが追加されます。

  • ソーター(インターフェース)
  • BubbleSorter(ICK、不潔、BOO!)
  • QuickSorter
  • HeapSorter

1のことを実現する際の主な問題は、遊びに来て情報を隠すことなく、あなたはオブジェクト指向の方法をあまり持っていません。これを行うためには、多くの項目でデータが非公開である必要があります。すべての公開データの「データ構造」アプローチとすべてのプライベートデータのOOアプローチとの間の適切なバランスを見つけるのが何回かの試みです。

A非常に純粋なOO-アプローチは、次のようになります。もちろん

class Book extends Entry { 

    public String getTitle() { 
    ... 
    } 
} 

List<Book> books = new List<Book>(); 
books.add(new Book(...)); 
books.add(new Book(...)); 
books.add(new Book(...)); 

Sorter sorter = new QuickSorter(); 
Comparison<Book> byTitle = new Comparison<Book>() { 
    public int compare(Book one, Book two) { 
     return String.compare(one.getTitle(), two.getTitle()); 
    } 
} 
sorter.sort(books, byTitle); 

を、そこにその人の価値異なるものがあり、そのため彼らは、有効な、しかし全く異なるOO構造を思い付くかもしれません。

最後に、java.util内のデータ構造の非常に良いOOっぽいセットがすでに存在し、それが新しいものを作成するのも楽しいかもしれないが、彼らはすでに最速のソートアルゴリズムを実装しているため、一つは(java.util.Listや友人を使用する必要がありますCollections.sort)、ほとんどの他の図書館はjava.util.Listであり、my.custom.Listではありません。

楽しくハッピーなハッキングをお楽しみください!

+0

ありがとう!非常に有益な –

+0

@SamBrothertonさて、それはちょっとだった。あなたは今それを読むべきです! :) –

+0

私はやった!どうもありがとう、私はこの情報を試してみて、遊ぶためにいくつかの基本的なオブジェクト指向プログラムを作る前に、ここでそれらを実装していただきありがとうございます! –

1

あなたは現在、配列に格納している内容を保存するDetailクラスを作成します。何かのように:次に

public class Detail { 
    public String name; 
    public String password; 
    public String state; 
} 

Detailオブジェクトの代わりに、配列の配列で動作するように既存のコードを変更します。

public Detail[] sort(Detail[] details){ 
    boolean flag = false; 
    do{ 
     flag = false; 
     for (int i = 0; i < details.length; i++){ 
      if(details[i].name.compareTo(details[i + 1].name) > 0){ 
       flag = true; 
       Detail temp = details[i]; 
       details[i] = details[i + 1]; 
       details[i + 1] = temp; 
      } 
     } 
     len--; 
    } while (flag); 
    return details; 
} 

それだけで配列をソートするためのライブラリ関数を使用するようにしても良いだろうが、あなたはそれをバブルソートについて学ぶためにこの方法を実行したい場合は、それは大丈夫だということに注意してください。

Detailのオブジェクトも使用するように、コードの他の部分を変更する必要があります。

+0

ありがとう、私は配列をソートするためのアルゴリズムに言ったように使用すると思いますが、あなたのおかげで私の授業で表示するバブルソートの例もあります。ありがとうございます。 –

+0

@SamBrotherton問題はありません、喜んで助けてください! – nhouser9

関連する問題