ورود

View Full Version : مبتدی: مشکل در نوشتن کلاس



ehsan_faal
شنبه 25 بهمن 1393, 21:35 عصر
سلام دوستان.من تا حالا به صورت شی گرا چیزی ننوشتم و واسه اولین بار این کد زیر رو نوشتم که قراره یه عدد رو بهش بدم بگه Palindrome هست یا نه و متد دیگه ای که واسش در نظر گرفتم قراره یه تعداد عدد Palindrome بعد از ورودی رو که خودم تعداد رو تعیین میکنم بهم بده.نمیدونم چرا خروجی همیشه یه چیزه ثابته.ممنون میشم بهم بگین مشکلم کجاست.

کلاس Palindrome:

package Package;

import java.util.ArrayList;
import java.util.List;

public class Palindrome {
private Integer Obj;
public Palindrome(Integer Number){
Obj=Number;
}
public boolean isPalindrome(){
String Str=Obj.toString();
return Str.equals(new StringBuilder(Str).reverse().toString());
}
public List<Integer> nextPalindrome(Integer Terms){
List<Integer> Palindromes=new ArrayList<>();
while(Palindromes.size()<Terms){
if(this.isPalindrome()){
Palindromes.add(Obj);
}
else{
this.Obj++;
}
}
return Palindromes;
}

}

کد کلاس اصلی:

package Package;

import java.util.List;

public class MainClass {

public static void main(String[] args) {
Palindrome P = new Palindrome(35);
System.out.println(P.isPalindrome());
List<Integer> list = P.nextPalindrome(5);
list.stream().forEach(l -> System.out.print(l + " "));

}
}



با تشکر

ahmad.mo74
شنبه 25 بهمن 1393, 22:53 عصر
سلام

من دو جور این کلاسو برات نوشتم. اولی رو خودم بیشتر میپسندم...

1 :


package test;


import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;


public class Palindrome {


public boolean isPalindrome(int number) {
String s = String.valueOf(number);
int len = s.length();
int mid = len / 2;
return new StringBuilder(s.substring(len % 2 == 0 ? mid : mid + 1)).reverse().toString().equals(s.substring(0, mid));
}


public List<Integer> nextPalindromes(int number, int count) {
return IntStream.iterate(number, n -> n + 1)
.filter(this::isPalindrome)
.limit(count)
.boxed().collect(Collectors.toList());
}


public static void main(String[] args) {
Palindrome palindrome = new Palindrome();
System.out.println(palindrome.isPalindrome(3443));
System.out.println(palindrome.nextPalindromes(1000 , 20));
}


}


2 :


package test;


import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;


public class Palindrome {


private int number;


public Palindrome() {
}


public Palindrome(int number) {
this.number = number;
}


public int getNumber() {
return number;
}


public void setNumber(int number) {
this.number = number;
}


public boolean isPalindrome() {
String s = String.valueOf(number);
int len = s.length();
int mid = len / 2;
return new StringBuilder(s.substring(len % 2 == 0 ? mid : mid + 1)).reverse().toString().equals(s.substring(0, mid));
}


public List<Integer> nextPalindromes(int count) {
int temp = number;
List<Integer> list = IntStream.iterate(number, n -> ++number + 1)
.filter(n -> isPalindrome())
.limit(count)
.boxed().collect(Collectors.toList());
number = temp;
return list;
}


public static void main(String[] args) {
Palindrome palindrome = new Palindrome(3443);
System.out.println(palindrome.isPalindrome());
System.out.println(palindrome.nextPalindromes(20)) ;
}


}


برای اولی میتونی parallel هم بکنی که سرعت بره بالاتر :


public List<Integer> nextPalindromes(int number, int count) {
return IntStream.iterate(number, n -> n + 1).parallel()
.filter(this::isPalindrome)
.limit(count)
.boxed().collect(Collectors.toList());
}

ehsan_faal
شنبه 25 بهمن 1393, 22:59 عصر
ممنون از لطفتون، فقط امکانش هست بگید اشکال کلاسی که خودم نوشته بودم کجاست؟

ahmad.mo74
شنبه 25 بهمن 1393, 23:10 عصر
توی while مشکل داری، اون else اضافس :


if (this.isPalindrome()) {
Palindromes.add(Obj);
}
this.Obj++;

ehsan_faal
شنبه 25 بهمن 1393, 23:16 عصر
اوه! عجب سوتی ای دادم. بازم ممنون.خیلی لطف کردی:تشویق:

ehsan_faal
یک شنبه 26 بهمن 1393, 00:02 صبح
دوست عزیز مشکل قبلیم حل شد.الان من توی کلاس یه سری تغییرات ایجاد کردم تا به یه چنین حالتی برسم:
دو جور سازنده داشته باشم، هم بتونم بهش آرگومان رد کنم که در این صورت فقط متدهایی که آرگومان نمیگیره استفاده میشه و هم اینکه بشه بدون آرگومان یه شی ساخت که در این صورت مستقیما به خود متد آرگومان رو بفرستم(مثل کاری که شما کردی).تا اینجا مشکلی نیس.
حالا میخوام بهش بفهمونم که واسه دومین متد در صورتی که سازنده آرگومانی نگرفته بیاد و از متد اولی که آرگومان میگیره استفاده کنه و در غیر اینصورت از متد اولی ای که با روش دوم نوشته شده استفاده بشه.(روش شما منظورمه،که آرگومان رو به خود متد پاس میدید)
با این اوصاف میشه دو تا متد اول هم اسم و دو تا متد دوم هم اسم داشت؟
این کدیه که نوشتم:

package MainPackage;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Palindrome {
private Integer Num;
private Integer Temp;
public Palindrome(){}
public Palindrome(Integer M){
this.Num=M;
}

public boolean isPalindrome(){
String Str=this.Num.toString();
return Str.equals(new StringBuilder(Str).reverse().toString());
}

public boolean isPalindrome(Integer Num){
this.Temp=Num;
String Str=Num.toString();
return Str.equals(new StringBuilder(Str).reverse().toString());
}
public List<Integer> nextListPalindromes(int Count){
return IntStream.iterate(this.Num, n->n+1)
.filter(this::isPalindrome).limit(Count).boxed().c ollect(Collectors.toList());
}

public List<Integer> nextListPalindromes(int Count){
return IntStream.iterate(this.Temp, n->n+1)
.filter(this::isPalindrome).limit(Count).boxed().c ollect(Collectors.toList());
}

}

ahmad.mo74
یک شنبه 26 بهمن 1393, 16:14 عصر
سعی کن همیشه stateless کد بزنی نه stateful مگر اینکه مجبور باشی!

http://whatis.techtarget.com/definition/stateless
http://stackoverflow.com/questions/844536/advantages-of-stateless-programming

بعد ها هم تو کار با فریم ورک های مهم و وب خیلی به دردت میخوره.

الان تو پست قبلی حالت اول stateless هست اما دومی stateful.



package test;


import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;


/**
* @author avb
*/
public class IntPalindrome {


private int number;


public IntPalindrome() {
}


public IntPalindrome(int number) {
this.number = number;
}


public int getNumber() {
return number;
}


public void setNumber(int number) {
this.number = number;
}


public boolean isPalindrome() {
return isPalindrome(number);
}


public List<Integer> nextPalindromes(int count) {
return nextPalindromes(number, count);
}


public static boolean isPalindrome(final int number) {
String s = String.valueOf(number);
int len = s.length();
int mid = len / 2;
return new StringBuilder(s.substring(len % 2 == 0 ? mid : mid + 1)).reverse().toString().equals(s.substring(0, mid));
}


public static List<Integer> nextPalindromes(final int number, final int count) {
return IntStream.iterate(number, n -> n + 1).parallel()
.filter(IntPalindrome::isPalindrome)
.limit(count)
.boxed().collect(Collectors.toList());
}


public static void main(String[] args) {
IntPalindrome intPalindrome = new IntPalindrome(55);
System.out.println(intPalindrome.isPalindrome());
intPalindrome.setNumber(2832);
System.out.println(intPalindrome.nextPalindromes(1 5));
System.out.println(IntPalindrome.isPalindrome(1233 21));
System.out.println(IntPalindrome.nextPalindromes(7 6543, 30));
}


}


یکی از مزایای stateless بودن رو هم همینجا داریم میبینیم. کد stateless معمولا (یا همیشه) thread safe هست و نگرانی کمتری برای مدیریت thread ها و تغییرات رو آبجکت ها داری. اما اگر stateful باشه به دلیل مشترک بودن منابع بین ترد ها (اینجا number مشترکه) همیشه امکان خطا هست و باید همیشه مراقب باشی.

مثلا فرض کن متد nextPalindromes رو صدا زدی و اون هم چه به صورت parallel و چه non-parallel داره محاسبه میکنه. اما همزمان متد setNumber هم از یه ترد دیگه صدا زده میشه!!! و بقیه داستان ها ... (synchronize, lock, ...)

اما تو این حالت چون number رو به عنوان پارامتر بهش دادیم و این number هیچ ربطی به اون number توی کلاس نداره و هر چقدر دلت میخواد setNumber رو صدا بزن.

(در ضمن اگر number مقدار دهی نشه بای دیفالت مقدار 0 توش ذخیره میشه)

ehsan_faal
یک شنبه 26 بهمن 1393, 16:45 عصر
دوست عزیز راستش من رشتم ربطی به برنامه نویسی و این حرفا نداره و فقط به خاطر علاقه میخوام یاد بگیرم.
چون وقتی برنامه ای رو بنویسی یه بار کامل راجع بهش فکر میکنی ولی واسه استفاده های بعدی حتی با داده های متفاوت ماشین به جات فکر میکنه و من واقعا با این کار حال میکنم.این لینکایی هم که شما گذاشتی هم دیدم و حقیقتش اونجور که باید مطلبو نگرفتم، حتی چیزی رو هم که شما مینویسی زیاد واسم ملموس نیست که هم یه سازنده داشته باشی هم یه متد ستر.یا اینکه گتر دقیقا به چه دردی میخوره اینجا!شرمنده ها ولی اگه اینا واسم جا نیفته احتمالن دچار مشکلات اساسی میشم در آینده.
خلاصه اینکه این پرفرمنسم رو به حساب خنگی نزنی ، تازه 2-3 هفته اس شروع کردم.
با تشکر