【力扣】2619. 數組原型對象的最后一個元素——認識原型與原型鏈

【力扣】2619. 數組原型對象的最后一個元素——認識原型與原型鏈

文章目錄

  • 【力扣】2619. 數組原型對象的最后一個元素——認識原型與原型鏈
    • 題目
    • 解決方案
      • 概述
        • 全局上下文
        • 函數上下文
        • 事件處理程序
        • 構造函數上下文
        • 類上下文
        • 顯式 / 隱式綁定
        • 綁定方法和永久 this 上下文
      • 方法 1:擴展數組原型以包含 .last() 方法
        • 概述
        • 算法步驟
        • 實現
          • 實現 1:常規 if 檢查
          • 實現 2:三元運算符
          • 實現 3:Nullish 合并運算符
          • 實現 4:使用數組 pop() 方法
          • 實現 5:將 Nullish 合并運算符與 Array.prototype.at() 方法結合使用
          • 實現 6:使用 Array.prototype.slice() 方法
          • 實現 7:使用默認參數
          • 實現 8:findLast 方法(適用于 ECMAScript 2022 及之后版本)
        • 復雜度分析
      • 方法 2:使用 ES6 Getters
        • 概述
        • 算法
        • 實現
        • 復雜度分析

題目

請你編寫一段代碼實現一個數組方法,使任何數組都可以調用 array.last() 方法,這個方法將返回數組最后一個元素。如果數組中沒有元素,則返回 -1

你可以假設數組是 JSON.parse 的輸出結果。

示例 1 :

輸入:nums = [null, {}, 3]
輸出:3
解釋:調用 nums.last() 后返回最后一個元素: 3。

示例 2 :

輸入:nums = []
輸出:-1
解釋:因為此數組沒有元素,所以應該返回 -1。

提示:

  • arr 是一個有效的 JSON 數組
  • 0 <= arr.length <= 1000

解決方案

概述

這個問題引導我們進入 JavaScript 編程的一個有趣部分:向內置原型添加新功能。盡管這因為可能會有潛在風險,通常不是推薦做法,但它確實提供了對 JavaScript 靈活和動態特性的深刻理解。在這個挑戰中,我們需要向Array原型添加一個last()方法。這個新方法將返回應用到它的任何數組的最后一個元素,如果數組為空則返回 -1。

在 JavaScript 中,數組是對象,所有對象都從它們的原型繼承屬性和方法。原型是一種用作創建其他對象基礎的“模板對象”。在這個上下文中,JavaScript 的 Array 對象是一個全局對象,包含用于操作數組的方法,這個對象可以通過自定義方法或屬性來擴展。

例如,讓我們看一下內置的push()方法,它可以將新的項添加到數組的末尾并返回新的長度。這個方法是Array原型的一部分,對 JavaScript 中的所有數組都可用:

let arr = [1, 2, 3];console.log(Array.prototype.hasOwnProperty('push')); // 這將返回 true,因為數組有 push 方法arr.push(4); // 現在 arr 是 [1, 2, 3, 4]

現在,如果你想向所有數組添加一個新的方法,例如 last(),你可以將它添加到 Array 原型中:

Array.prototype.last = function() {// 這里放置 last 方法的實現
};

你創建的所有數組現在都可以訪問這個last()方法:

let arr = [1, 2, 3];
console.log(arr.last()); // 你的實現將決定這將輸出什么

擴展內置原型,如Array的原型,可能會有潛在風險,因為如果你的方法名稱與未來的 JavaScript 更新或其他庫的方法名稱沖突,可能會導致意想不到的行為。例如,考慮嘗試覆蓋Array原型上的push()方法:

Array.prototype.push = function() {console.log('push 方法已被覆蓋!');
};let nums = [1, 2, 3];
nums.push(4); // push 方法已被覆蓋!

在這種情況下,push() 方法不再將元素附加到數組的末尾。相反,它僅僅在控制臺上記錄一條消息。

通常不鼓勵覆蓋內置方法,push() 方法廣泛用于 JavaScript,改變其功能可能導致大量的錯誤和問題。這在處理第三方庫或其他開發者的代碼時尤其麻煩,因為他們期望push()方法按預期工作。

如果需要一個內置方法的修改版本,通常建議創建一個單獨的方法或函數。例如,你可以開發一個新的函數,將元素附加到數組中,然后記錄一條消息:

function pushAndLog(array, element) {array.push(element);console.log('元素 ' + element + ' 已添加到數組中。');
}let nums = [1, 2, 3];
pushAndLog(nums, 4); // 元素 4 已添加到數組中。
console.log(nums); // [1, 2, 3, 4]

在這個問題中,你的任務是擴展Array原型,包含一個last()方法,如果存在,它應該返回數組的最后一個元素,如果數組為空,則返回 -1。

理解這個任務涉及到理解 JavaScript 中的this關鍵字。在這里,JavaScript 中的this關鍵字的行為與其他編程語言略有不同。this 的值取決于函數調用時的上下文。在這個問題中,this 將引用當前調用last()方法的對象,它將是一個數組。

在 JavaScript 中,this 的行為與其他編程語言稍有不同。它的值由它的使用上下文決定,這對初學者來說可能會讓人感到困惑。因此,了解上下文和this在不同情況下所指的對象是至關重要的。

全局上下文

在全局執行上下文中(即,在任何函數之外),this 無論在嚴格模式還是非嚴格模式下,都引用全局對象。

web瀏覽器中,全局對象是 window,所以 this 將引用window對象:

console.log(this); // 在瀏覽器上下文中會記錄 "[object Window]"

Node.js環境中,全局對象不是window而是 global。因此,如果在Node.js上下文中運行相同的代碼,this 將引用全局對象:

console.log(this); // 在 Node.js 上下文中會記錄 "[object global]"
函數上下文

在普通函數內部,this 的值取決于函數的調用方式。如果函數在全局上下文中調用,this 在嚴格模式下將為 undefined,在非嚴格模式下將引用全局對象。

function func() {console.log(this);
}func(); // 在非嚴格模式的瀏覽器上下文中記錄 "[object Window]",在嚴格模式下會記錄 "undefined"

但是,當函數充當對象的方法時,this 將引用調用該方法的對象。這展示了this的值不綁定于函數本身,而是由函數被調用的方式和位置決定,這個概念稱為執行上下文:

let obj = {prop: "Hello",func: function() {console.log(this.prop);}
}obj.func(); // 記錄 "Hello"

然而,箭頭函數不具有自己的 this。相反,它們從創建時的父作用域繼承 this。換句話說,箭頭函數內部的 this 值不由它的調用方式決定,而是由它的定義時的外部詞法上下文決定:

let obj = {prop: "Hello",func: () => {console.log(this.prop);}
}obj.func(); // 記錄 "undefined",因為箭頭函數內部的 `this` 不綁定到 `obj`,而是綁定到其外部詞法上下文

這在某些情況下可能很有用,但它也使得箭頭函數不適合需要訪問它們被調用的對象的其他屬性的方法。

事件處理程序

在事件處理程序的上下文中,this 引用附加了事件監聽器的元素,與event.currentTarget相同。

button.addEventListener('click', function() {console.log(this); // 記錄按鈕的整個 HTML 內容
});

重要的是注意,它不引用常用的event.target屬性。讓我們澄清event.currentTarget和 event.target `之間的區別。

event.currentTarget:該屬性引用附加了事件處理程序(如 addEventListener)的元素。這是在事件處理程序函數的上下文中this引用的內容。

event.target:該屬性引用引發事件的實際 DOM 元素。對于會冒泡的事件特別重要。如果你點擊內部元素,事件將冒泡到外部元素,觸發它們的事件監聽器。對于這些外部元素,event.target 將是實際被點擊的最內層元素,而 event.currentTarget(或 this)將是當前處理程序附加到的元素。

<div id="outer">點擊我<div id="inner">或者點擊我</div>
</div><script>
document.getElementById('outer').addEventListener('click', function(event) {console.log("currentTarget: ", event.currentTarget.id);console.log("this: ", this.id);console.log("target: ", event.target.id);
});
</script>

在這種情況下,如果你點擊外部 div,所有三個日志都將打印 "outer",因為點擊的元素(target)和處理程序附加的元素(currentTarget 或 this)是相同的。但是,如果你點擊內部 div 中的 “或者點擊我” 文本,event.target 將是 "inner"(因為這是你點擊的元素),而 event.currentTarget(或 this)仍將是 "outer"(因為這是事件處理程序附加的元素)。

構造函數上下文

在構造函數內部,this 引用新創建的對象。但是,這里的“新創建”是什么意思呢?要理解這一點,我們需要探討 JavaScript 中的new關鍵字。當你在函數調用之前使用 new 時,它告訴 JavaScript 進行四個操作:

創建一個新的空對象。這不是一個函數、數組或 null,只是一個空對象。
使函數內部的this引用這個新對象。新對象與構造函數內的this關聯起來。這就是為什么Person(name)內的this.name實際上修改了新對象。
正常執行函數。它像通常情況下執行函數代碼一樣執行。
如果函數沒有返回自己的對象,則返回新對象。如果構造函數返回一個對象,那個對象將被返回,而不是新對象。如果返回其他任何內容,將返回新對象。
new 關鍵字允許 JavaScript 開發者以面向對象的方式使用語言,從構造函數中創建實例,就像其他語言中的類一樣。這也意味著構造函數內部的this關鍵字將像從基于類的語言中轉換的開發者所期望的那樣引用對象的新實例。

function Person(name) {// 當使用 `new` 調用時,這是一個新的、空的對象this.name = name; // `this` 現在有一個 `name` 屬性// 函數結束后,將返回 `this`,因為沒有其他對象被函數返回
}let john = new Person('John'); // `john` 現在是函數 `Person` 返回的對象,包含一個值為 'John' 的 `name` 屬性
console.log(john.name); // 記錄 "John"
類上下文

在類中,方法內部的this引用類的實例:

class ExampleClass {constructor(value) {this.value = value;}logValue() {console.log(this.value);}
}const exampleInstance = new ExampleClass('Hello');
exampleInstance.logValue(); // 記錄 "Hello"
顯式 / 隱式綁定

你還可以使用函數上的 .call().apply() .bind()方法來明確設置 this 的上下文:

function logThis() {console.log(this);
}const obj1 = { number: 1 };
const obj2 = { number: 2 };logThis.call(obj1); // 記錄 obj1
logThis.call(obj2); // 記錄 obj2const boundLogThis = logThis.bind(obj1);
boundLogThis(); // 記錄 obj1
綁定方法和永久 this 上下文

JavaScript 提供了一個名為bind的內置方法,允許我們設置方法中的this值。這個方法創建一個新函數,當調用時,將其this關鍵字設置為提供的值,以及在調用新函數時提供的一系列參數。

bind 方法的獨特之處在于它創建了一個永久綁定的this值,無論后來如何調用該函數,都不會更改this的值。下面的示例演示了bind如何提供一種鎖定函數中的this值的方法,在各種情況下都很有幫助,例如在設置事件處理程序時,希望this值始終引用特定對象,或者在使用調用回調函數的庫或框架時,希望在回調中控制this引用的對象。

function greet() {return `你好,我是 ${this.name}`;
}let person1 = { name: 'Alice' };
let person2 = { name: 'Bob' };// 創建一個與 `person1` 綁定的函數
let greetPerson1 = greet.bind(person1);console.log(greetPerson1()); // 你好,我是 Alice// 嘗試使用 `call` 方法更改上下文;但是,它仍然使用 `person1` 作為 `this` 上下文
console.log(greetPerson1.call(person2)); // 你好,我是 Alice// 相比之下,正常函數調用允許使用 `call` 方法設置 `this` 上下文
console.log(greet.call(person2)); // 你好,我是 Bob

在 JavaScript 中,了解this 關鍵字的上下文對于操作和與對象交互非常重要,特別是在處理面向對象編程、事件處理程序和函數調用的某些方面。了解this的行為有助于改善代碼的結構,并使其更可預測和更容易調試。此外,某些設計模式,如工廠模式和裝飾器模式,大量使用 this,因此了解其行為對于有效實現這些模式至關重要。

JavaScript 中的一個關鍵概念是函數對象中的 this 值通常不是固定的 - 它通常是根據函數的執行上下文而確定的,而不是根據其定義的時刻。然而,也有例外情況。使用函數上的 bind()call() apply()方法時,這些方法允許你顯式設置函數調用的this值,從而覆蓋其默認行為。此外,JavaScript 中的箭頭函數行為不同。它們不綁定自己的this值。相反,它們從定義它們的外部詞法環境中捕獲this的值,并且這個值在函數的整個生命周期內保持不變。這些差異使得理解和使用 JavaScript 中的this既具有挑戰性又非常重要。

方法 1:擴展數組原型以包含 .last() 方法

概述

根據問題陳述,您需要增強所有數組,使其具有返回數組最后一個元素的方法 .last()。如果數組中沒有元素,則應返回-1。

為此,您可以向數組原型添加一個新方法。這個新方法可以通過訪問這個this[this.length-1]簡單地返回數組的最后一個元素。

添加到數組原型的方法中的this關鍵字引用調用該方法的數組。

注意:擴展原生原型是 JavaScript 的一個強大功能,但應該謹慎使用。如果其他代碼(或更高版本的 JavaScript)添加了同名的方法,則可能會導致沖突。在擴展本機原型時始終保持謹慎。

算法步驟

在名為 last 的數組原型上定義一個新方法。
在這個方法中,檢查數組是否為空。如果是,返回 -1。
如果數組不為空,則返回數組的最后一個元素。最后一個元素可以通過以下方式訪問:this[this.length - 1]。

實現

這種方法可以通過各種方式實現。

實現 1:常規 if 檢查
Array.prototype.last = function() {if (this.length === 0) {return -1;}return this[this.length - 1];
}
實現 2:三元運算符
Array.prototype.last = function() {return this.length === 0 ? -1 : this[this.length - 1];
}

這個版本使用了一個三元運算符,代碼更簡潔。? 和 : 就像一個簡短 if/else。

實現 3:Nullish 合并運算符
Array.prototype.last = function() {return this[this.length - 1] ?? -1;
}

此版本使用空合并運算符(??)。如果不為null undefined,則返回左側操作數,否則返回右側操作數。
請注意,此實現假定數組只包含數字。如果數組的最后一個元素為空或未定義,則此方法將返回-1,這可能會掩蓋最后一個元素的實際值。它可能不適合包含其他數據類型的數組,在這些數組中,null undefined 是有效且不同的值。始終確保使用適合數組中包含的數據類型的方法。

實現 4:使用數組 pop() 方法
Array.prototype.last = function() {let val = this.pop();return val !== undefined ? val : -1;
}

此版本使用數組pop()方法,該方法從數組中移除最后一個元素并返回它。如果數組為空,則pop()返回 undefined,我們檢查它并將其替換為 -1。需要注意的是,該操作會改變原始數組,這可能并不理想,具體取決于您的用例。

實現 5:將 Nullish 合并運算符與 Array.prototype.at() 方法結合使用
Array.prototype.last = function() {return this.at(-1) ?? -1;
}

在此版本中,我們使用ECMAScript 2021中引入的 Array.prototype.at() 方法。此方法接受一個整數值,并返回該索引處的元素,允許使用正整數和負整數。負整數從數組末尾開始計數。如果數組為空,則at(-1)將是未定義的,因此我們提供 -1 作為備用。

實現 6:使用 Array.prototype.slice() 方法
Array.prototype.last = function() {return this.length ? this.slice(-1)[0] : -1;
}

在這種方法中,我們使用Array.prototype.slice()方法。此方法提取數組的一部分并返回新數組。我們通過提供 -1 作為參數來請求最后一個元素。如果數組為空,則slice(-1)[0]將為 undefined,因此我們提供 -1 作為備用。需要注意的是,該方法不會改變原始數組,這與我們前面提到的pop()方法不同。

實現 7:使用默認參數
Array.prototype.last = function() {const [lastElement = -1] = this.slice(-1);return lastElement;
}

此實施使用帶缺省值的 ES6 解構。它本質上與slice(-1)[0]版本相同,但具有不同的語法。

實現 8:findLast 方法(適用于 ECMAScript 2022 及之后版本)

此版本使用 Array.prototype.findLast(),這是為 ECMAScript 2022 建議的一種方法,用于查找數組中滿足所提供測試函數的最后一個元素。在這里,我們提供了一個始終返回 true 的函數,因此它將返回最后一個元素,如果數組為空,則返回 -1。

請注意,此解決方案可能在某些情況下不起作用,因為findLast()尚未得到廣泛支持。請始終查看當前的 JavaScript 文檔,了解其可用性和兼容性。如果要在不支持findLast()的環境中使用 findLast(),可以創建 polyfill

if (!Array.prototype.findLast) {Array.prototype.findLast = function(predicate) {for (let i = this.length - 1; i >= 0; i--) {if (predicate(this[i], i, this)) {return this[i];}}return undefined;};
}

以下是完整的解決方案,我們還包括findLast() polyfill,根據您的環境可能不需要:

if (!Array.prototype.findLast) {Array.prototype.findLast = function(predicate) {for (let i = this.length - 1; i >= 0; i--) {if (predicate(this[i], i, this)) {return this[i];}}return undefined;};
}Array.prototype.last = function() {return this.findLast(() => true) ?? -1;
}
復雜度分析

時間復雜度:O(1)。無論數組的大小如何,我們只訪問數組的最后一個元素,這是一個恒定的時間操作。
空間復雜度:O(1)。這是因為我們沒有使用任何隨輸入數組大小而擴展的額外空間。在空間復雜性分析中不考慮數組本身,因為它是函數的輸入。我們只考慮該函數使用的任何額外空間。

需要注意的是,就時間和空間復雜性而言,將方法添加到陣列原型不會影響其他陣列,因為它不會為每個陣列重復該方法。相反,該方法駐留在原型中,并且可以由所有數組訪問。這使得它成為一種高度節省空間的操作。

方法 2:使用 ES6 Getters

概述

在 JavaScript 中,getter 是獲取特定屬性的值的方法。在這里,我們將為最后一個屬性創建一個 getter

算法
  1. 通過為最后一個屬性定義一個 getter來增強數組原型。
  2. getter 函數將返回另一個函數,該函數返回數組的最后一個元素,如果數組為空,則返回 -1。
實現
Object.defineProperty(Array.prototype, 'last', {get: function() {return () => this.length ? this[this.length - 1] : -1;}
});

當你定義一個getter時,你實際上是把 last 當作一個屬性而不是一個函數。因此,它是通過array.last而不是array.last()訪問的。如果您將數組的最后一個元素視為該數組的屬性,而不是函數的結果,則這種觀點在語義上會更清晰。Getter可以提供一種更精煉的、類似于屬性的語法,以增強可讀性,特別是當您要實現的操作不需要任何參數并且在概念上是一個屬性時。

此外,當在大量使用gettersetter的代碼庫中工作時,使用getter可以提高一致性。然而,在您的特定問題的上下文中注意到這一點很重要:因為getter被視為一個屬性,所以需要一個嵌套的函數來通過在線判斷。這個附加層提供了一種與屬性交互的方法,使評測機能夠實現預期的適當功能。

復雜度分析

時間復雜度:O(1)。在 JavaScript 中,訪問數組中特定索引處的元素是一個恒定的時間操作。

空間復雜度:O(1)。不會使用額外的空間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896499.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu終端指令集 shell編程基礎(一)

磁盤指令 連接與查看&#xff1a;磁盤與 Ubuntu 有兩種連接方式&#xff1b;使用ls /dev/sd*查看是否連接成功&#xff0c;通過df系列指令查看磁盤使用信息。若 U 盤已掛載&#xff0c;相關操作可能失敗&#xff0c;需用umount取消掛載。磁盤操作&#xff1a;使用sudo fdisk 磁…

基于Spark的電商供應鏈系統的設計與實現

目錄 1.研究背景與意義 2、國內外研究現狀 3、相關理論與技術 &#xff08;一&#xff09;分布式計算系統Spark &#xff08;二&#xff09;數據倉庫Hive &#xff08;三&#xff09;讀取服務器本地磁盤的日志數據Flume &#xff08;四&#xff09;分布式消息隊列Kafka …

使用TortoiseGit配合BeyondCompare實現在Git倉庫中比對二進制文件

使用TortoiseGit的比對工具可以直接右鍵&#xff0c;點擊選擇比對和上一版本的變化差異&#xff1a; 但是TortoiseGit只能支持比對純文本文件的變化差異&#xff0c;如果嘗試比對二進制文件&#xff0c;會提示這不是一個有效的文本文件&#xff1a; BeyondCompare可以比對二進制…

BladeX框架接口請求跨域

前端使用代理請求接口&#xff0c;接口可以正常訪問。如果換全路徑請求就跨域。 除了后端要配置跨域 還需要修改配置文件對OPTIONS請求的限制

Vue.js響應式基礎

響應式基礎? API 參考 本頁和后面很多頁面中都分別包含了選項式 API 和組合式 API 的示例代碼。現在你選擇的是 組合式 API。你可以使用左側側邊欄頂部的“API 風格偏好”開關在 API 風格之間切換。 聲明響應式狀態? ref()? 在組合式 API 中,推薦使用 ref() 函數來聲明…

選開源CMS建站系統時,插件越多越好嗎?

在選擇開源CMS建站系統時&#xff0c;插件數量并不是唯一的衡量標準&#xff0c;更不能簡單地說“插件越多就越好”&#xff0c;還是需要綜合評估來考慮選擇結果&#xff0c;以下是有關選擇開源CMS系統時對插件數量的考量。 插件數量的優勢插件數量可能帶來的問題功能豐富性&a…

在VSCode中使用MarsCode AI最新版本詳解

如何在VSCode中使用MarsCode AI&#xff1a;最新版本詳解與使用場景 在當今快速發展的軟件開發領域&#xff0c;人工智能&#xff08;AI&#xff09;技術的應用已經變得越來越普遍。ByteDance推出的MarsCode AI是一款強大的AI編程助手&#xff0c;旨在幫助開發者更高效地編寫代…

mac修改docker的daemon.json 鏡像文件

1、找到daemon.json文件的位置 docker info 可以看出位置在&#xff1a; /Users/spuer/.docker 2. 進入daemon.json 所在的目錄&#xff1a; cd /Users/spuer/.docker3. 查看daemon.json的內容&#xff1a; more daemon.json可以看出&#xff0c;沒有配置registry-mirrors&…

5.10 P-Tuning v2:多層級提示編碼的微調革新

P-Tuning v2:多層級提示編碼的微調革新 一、技術架構解析 #mermaid-svg-4Wy6vkXZi67hY9PZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Wy6vkXZi67hY9PZ .error-icon{fill:#552222;}#mermaid-svg-4Wy6vkXZi67h…

Eclipse 編譯項目指南

Eclipse 編譯項目指南 引言 Eclipse 是一款功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;廣泛用于Java、C/C、Python等多種編程語言的開發。在Eclipse中編譯項目是進行軟件開發的基礎步驟。本文將詳細介紹如何在Eclipse中編譯項目&#xff0c;包括項目設置…

【大語言模型】【整合版】DeepSeek 模型提示詞學習筆記(散裝的可以看我之前的學習筆記,這里只是歸納與總結了一下思路,內容和之前發的差不多)

以下是個人筆記的正文內容: 原文在FlowUs知識庫上&#xff0c;如下截圖。里面內容和這里一樣&#xff0c;知識排版好看一點 一、什么是 DeepSeek 1. DeepSeek 簡介 DeepSeek 是一家專注于通用人工智能&#xff08;AGI&#xff09;的中國科技公司&#xff0c;主攻大模型研發與…

【緩存】緩存雪崩與緩存穿透:高并發系統的隱形殺手

緩存雪崩與緩存穿透&#xff1a;高并發系統的隱形殺手 在高并發系統中&#xff0c;緩存是提升性能的重要手段。然而&#xff0c;緩存使用不當也會帶來一系列問題&#xff0c;其中最常見的就是緩存雪崩和緩存穿透。這兩個問題如果不加以解決&#xff0c;可能會導致系統崩潰&…

additional-spring-configuration-metadata.json實現springboot自定義提示

在配置additional-spring-configuration-metadata.json文件后&#xff0c;在開發人員的IDE工具使用個人編寫的配置讀取很有效的在application.properties或application.yml文件下完成提示。 配置元數據文件位于jar下面。 META-INF/spring-configuration-metadata.json它們使用簡…

Dify在Ubuntu20.04系統的部署

文章目錄 一、dify 介紹1.核心功能優勢2.應用場景 二、dify 安裝(docker方式)1.代碼庫下載2.配置文件修改3.啟動docker 容器 三、遇到問題與解決1.使用sudo docker compose up -d報錯2.使用service docker start報錯 一、dify 介紹 Dify 是一款開源的大語言模型&#xff08;LL…

kafka-關于ISR-概述

一. 什么是ISR &#xff1f; Kafka 中通常每個分區都有多個副本&#xff0c;其中一個副本被選舉為 Leader&#xff0c;其他副本為 Follower。ISR 是指與 Leader 副本保持同步的 Follower 副本集合。ISR 機制的核心是確保數據在多個副本之間的一致性和可靠性&#xff0c;同時在 …

1_安裝JDK和Hadoop

一、解壓jdk和hadoop安裝包 下載 通過百度網盤分享的文件&#xff1a;jdk-8u172-linux-x64.tar.gz 鏈接&#xff1a;https://pan.baidu.com/s/1VjhdpfyqdC7ivEBIjTn8tA 提取碼&#xff1a;iz25 二、配置環境變量 vi /root/.bashrc添加 #set java environment export JAVA_H…

.Net 9下使用Tensorflow.net---DNN_Keras

.Net 9下使用Tensorflow.net---DNN_Keras 1、創建應用&#xff0c;導入依賴2、編寫代碼1&#xff09;添加引用2&#xff09;創建基礎對象3&#xff09;初始化數據集4&#xff09;重點步驟&#xff1a;創建 Keras下的DNN模型5&#xff09;訓練模型得到評估值6&#xff09;結果輸…

邊緣計算收益低的三大指標

邊緣計算收益低的三大指標主要包括以下方面&#xff1a; 1. 資源貢獻不足&#xff1a; 邊緣計算的收益通常基于所提供的帶寬、存儲和計算資源來計算。如果設備的網絡帶寬有限、在線時間短或提供的存儲容量較小&#xff0c;可能無法滿足平臺設定的最低貢獻標準&#xff0c;從而導…

重大更新!鋰電池剩余壽命預測新增 CALCE 數據集

往期精彩內容&#xff1a; 單步預測-風速預測模型代碼全家桶-CSDN博客 半天入門&#xff01;鋰電池剩余壽命預測&#xff08;Python&#xff09;-CSDN博客 超強預測模型&#xff1a;二次分解-組合預測-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention預測模型…

開發一個交易所需要哪些技術?

在當今數字化時代&#xff0c;交易所作為金融市場的重要組成部分&#xff0c;其技術架構和功能的復雜性日益增加。無論是傳統的股票、期貨交易所&#xff0c;還是新興的數字貨幣交易所&#xff0c;開發一個高效、安全、可靠的交易所系統都是一個復雜而系統的工程。本文將深入探…