راهحلهای سؤالات مسابقهٔ دستگرمی Java کدکاپ ۷ در ادامه توضیح داده شدند. در صورتی که متوجه راهحلی نشدید، میتونید در بخش نظرات، سؤالات و ابهامهای خودتون رو مطرح کنید.
اگه راهحل دیگهای برای سؤالات دارید، خوشحال میشیم که راهحلتون رو در بخش نظرات با ما و دوستانتون به اشتراک بذارید.
برای حل این سؤال، صرفاً باید رشتهٔ Hello CodeCup n
را در متد sayHelloToCodeCup
برگرداند. n
پارامتر ورودی متد است:
public static String sayHelloToCodeCup(int n) {
return "Hello CodeCup " + n;
}
همچنین، میتوان از متد format
کلاس String
استفاده کرد.
در این سؤال، ابتدا باید بررسی کرد که آیا رشتههای ورودی null
یا خالی هستند یا خیر. اگر حداقل یکی از آنها null یا خالی باشد، باید مقدار صفر را برگرداند:
if (one == null || one.isEmpty() || two == null || two.isEmpty()) {
return 0;
}
در ادامه، اگر طول رشتهٔ اول را n و طول رشتهٔ دوم را m در نظر بگیریم، به ازای تمامی iها از 0 تا n-m باید بررسی کرد که آیا زیررشتهای از one
که از اندیس i شروع میشود و تا i+m ادامه مییابد برابر با two
است یا خیر:
int repeats = 0;
for (int i = 0; i <= one.length() - two.length(); i++) {
if (one.substring(i, i + two.length()).equals(two)) {
repeats++;
}
}
return repeats;
برای پیادهسازی متد transformException
، میتوان ابتدا یک List
از ExceptionProxy
ها در نظر گرفت. به ازای هر یک از Supplier
های موجود در لیست ورودی، متد get مربوط به Supplier
را در یک بلوک try
فراخوانی میکنیم. اگر Exception
پرتاب شود، یک نمونه از ExceptionProxy
با پیغام برابر با پیغام Exception
پرتابشده و در غیر اینصورت، یک نمونه از ExceptionProxy
با پیغام OK!
را به لیست اضافه میکنیم. در نهایت، لیست را برمیگردانیم:
List<ExceptionProxy> result = new ArrayList<>();
for (Supplier<?> function : functions) {
String msg = "OK!";
try {
function.get();
} catch (Exception e) {
msg = e.getMessage();
}
ExceptionProxy ex = new ExceptionProxy(msg, function);
result.add(ex);
}
return result;
برای انجام محاسبات در هر مرحله بهصورت همروند، میتوان Supplier
های هر مرحله را در قالب تردهای مجزا اجرا کرد و با استفاده از متد join
منتظر پایان آنها ماند. برای مثال، برای انجام محاسبات fs، میتوان بهصورت زیر عمل کرد:
List<Thread> threads = param.fs.stream().map(sup -> new RunnerThread(() -> {
sup.get();
}, String.valueOf(param.fs.indexOf(sup) + 1))).collect(Collectors.toList());
threads.forEach(t -> t.start());
threads.forEach(t -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
کلاس RunnerThread
بهصورت زیر تعریف شده است:
class RunnerThread extends Thread {
public RunnerThread(Runnable r, String name) {
super(r, name);
}
@Override
public String toString() {
return this.getName();
}
}
روشهای متعددی برای پیادهسازی این سؤال وجود دارد. میتوان تعدادی ریپازیتوری و سرویس را پیادهسازی کرد. برای مثال، میتوان در یک سرویس مربوط به مشتریها، عملیات ساخت مشتری را بهصورت زیر انجام داد:
@Override
public CustomerCreateResult createCustomer(CustomerCreateParam customer) {
if (repository.existsByUserName(customer.getUsername())) {
return null;
}
CustomerEntity entity = repository.save(
CustomerEntity.builder()
.firstName(customer.getFirstName())
.lastName(customer.getLastName())
.username(customer.getUsername())
.build()
);
return new CustomerCreateResult(entity.getId());
}
در نهایت، میتوان در یک RestController
یک route بهصورت زیر تعریف کرد:
@PostMapping(value = "/api/customers")
public ResponseEntity<Object> createCustomer(@RequestBody CustomerCreateParam customer) {
CustomerCreateResult result = customerService.createCustomer(customer);
if (result == null) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Username already taken");
}
return ResponseEntity.status(HttpStatus.CREATED).body(result);
}